Skip to content

Commit ff204c9

Browse files
Marco Pelagattibeikov
authored andcommitted
HHH-18170 Subquery randomly generating wrong SQL due to duplicate alias
1 parent ac9e4ac commit ff204c9

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationHelper.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.hibernate.spi.NavigablePath;
1212
import org.hibernate.query.sqm.tree.domain.SqmPath;
1313

14+
import java.util.concurrent.atomic.AtomicLong;
15+
1416
/**
1517
* @author Steve Ebersole
1618
*/
@@ -27,6 +29,8 @@ public class SqmCreationHelper {
2729
*/
2830
public static final String IMPLICIT_ALIAS = "{implicit}";
2931

32+
private static final AtomicLong UNIQUE_ID_COUNTER = new AtomicLong();
33+
3034
public static NavigablePath buildRootNavigablePath(String base, String alias) {
3135
return new NavigablePath( base, determineAlias( alias ) );
3236
}
@@ -35,10 +39,14 @@ public static NavigablePath buildSubNavigablePath(NavigablePath lhs, String base
3539
return lhs.append( base, determineAlias( alias ) );
3640
}
3741

42+
public static String acquireUniqueAlias() {
43+
return Long.toString(UNIQUE_ID_COUNTER.incrementAndGet());
44+
}
45+
3846
public static String determineAlias(String alias) {
3947
// Make sure we always create a unique alias, otherwise we might use a wrong table group for the same join
4048
if ( alias == null ) {
41-
return Long.toString( System.nanoTime() );
49+
return acquireUniqueAlias();
4250
}
4351
else if ( alias == IMPLICIT_ALIAS ) {
4452
return null;

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
1616
import org.hibernate.metamodel.mapping.ModelPart;
1717
import org.hibernate.metamodel.mapping.internal.BasicAttributeMapping;
18+
import org.hibernate.query.sqm.spi.SqmCreationHelper;
1819
import org.hibernate.spi.NavigablePath;
1920
import org.hibernate.sql.ast.SqlAstWalker;
2021
import org.hibernate.sql.ast.spi.SqlAstCreationState;
@@ -46,7 +47,7 @@ public EmbeddableValuedExpression(
4647
assert mapping != null;
4748
assert sqlExpression != null;
4849
assert mapping.getEmbeddableTypeDescriptor().getNumberOfAttributeMappings() == sqlExpression.getExpressions().size();
49-
this.navigablePath = baseNavigablePath.append( mapping.getPartName(), Long.toString( System.nanoTime() ) );
50+
this.navigablePath = baseNavigablePath.append( mapping.getPartName(), SqmCreationHelper.acquireUniqueAlias());
5051
this.mapping = mapping;
5152
this.sqlExpression = sqlExpression;
5253
}

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/AbstractSqmDmlStatement.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.query.criteria.JpaCteCriteria;
1616
import org.hibernate.query.sqm.NodeBuilder;
1717
import org.hibernate.query.sqm.SqmQuerySource;
18+
import org.hibernate.query.sqm.spi.SqmCreationHelper;
1819
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
1920
import org.hibernate.query.sqm.tree.expression.SqmParameter;
2021
import org.hibernate.query.sqm.tree.from.SqmRoot;
@@ -85,21 +86,21 @@ public <X> JpaCteCriteria<X> getCteCriteria(String cteName) {
8586

8687
@Override
8788
public <X> JpaCteCriteria<X> with(AbstractQuery<X> criteria) {
88-
return withInternal( Long.toString( System.nanoTime() ), criteria );
89+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), criteria );
8990
}
9091

9192
@Override
9293
public <X> JpaCteCriteria<X> withRecursiveUnionAll(
9394
AbstractQuery<X> baseCriteria,
9495
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
95-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, false, recursiveCriteriaProducer );
96+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, false, recursiveCriteriaProducer );
9697
}
9798

9899
@Override
99100
public <X> JpaCteCriteria<X> withRecursiveUnionDistinct(
100101
AbstractQuery<X> baseCriteria,
101102
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
102-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, true, recursiveCriteriaProducer );
103+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, true, recursiveCriteriaProducer );
103104
}
104105

105106
@Override

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/AbstractSqmSelectQuery.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.hibernate.query.criteria.JpaRoot;
2020
import org.hibernate.query.criteria.JpaSelection;
2121
import org.hibernate.query.sqm.NodeBuilder;
22+
import org.hibernate.query.sqm.spi.SqmCreationHelper;
2223
import org.hibernate.query.sqm.tree.AbstractSqmNode;
2324
import org.hibernate.query.sqm.tree.SqmCopyContext;
2425
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
@@ -97,21 +98,21 @@ public <X> JpaCteCriteria<X> getCteCriteria(String cteName) {
9798

9899
@Override
99100
public <X> JpaCteCriteria<X> with(AbstractQuery<X> criteria) {
100-
return withInternal( Long.toString( System.nanoTime() ), criteria );
101+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), criteria );
101102
}
102103

103104
@Override
104105
public <X> JpaCteCriteria<X> withRecursiveUnionAll(
105106
AbstractQuery<X> baseCriteria,
106107
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
107-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, false, recursiveCriteriaProducer );
108+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, false, recursiveCriteriaProducer );
108109
}
109110

110111
@Override
111112
public <X> JpaCteCriteria<X> withRecursiveUnionDistinct(
112113
AbstractQuery<X> baseCriteria,
113114
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
114-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, true, recursiveCriteriaProducer );
115+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, true, recursiveCriteriaProducer );
115116
}
116117

117118
@Override

0 commit comments

Comments
 (0)