Skip to content

Commit 3790c19

Browse files
Marco Pelagattibeikov
Marco Pelagatti
authored andcommitted
HHH-18170 Subquery randomly generating wrong SQL due to duplicate alias
1 parent 1919409 commit 3790c19

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
@@ -16,6 +16,7 @@
1616
import org.hibernate.query.criteria.JpaRoot;
1717
import org.hibernate.query.sqm.NodeBuilder;
1818
import org.hibernate.query.sqm.SqmQuerySource;
19+
import org.hibernate.query.sqm.spi.SqmCreationHelper;
1920
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
2021
import org.hibernate.query.sqm.tree.expression.SqmParameter;
2122
import org.hibernate.query.sqm.tree.from.SqmRoot;
@@ -84,21 +85,21 @@ public <X> JpaCteCriteria<X> getCteCriteria(String cteName) {
8485

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

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

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

104105
@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;
@@ -112,21 +113,21 @@ public <X> JpaCteCriteria<X> getCteCriteria(String cteName) {
112113

113114
@Override
114115
public <X> JpaCteCriteria<X> with(AbstractQuery<X> criteria) {
115-
return withInternal( Long.toString( System.nanoTime() ), criteria );
116+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), criteria );
116117
}
117118

118119
@Override
119120
public <X> JpaCteCriteria<X> withRecursiveUnionAll(
120121
AbstractQuery<X> baseCriteria,
121122
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
122-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, false, recursiveCriteriaProducer );
123+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, false, recursiveCriteriaProducer );
123124
}
124125

125126
@Override
126127
public <X> JpaCteCriteria<X> withRecursiveUnionDistinct(
127128
AbstractQuery<X> baseCriteria,
128129
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
129-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, true, recursiveCriteriaProducer );
130+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, true, recursiveCriteriaProducer );
130131
}
131132

132133
@Override

0 commit comments

Comments
 (0)