Skip to content

Commit d33ed62

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

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.SqmCteContainer;
2021
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
2122
import org.hibernate.query.sqm.tree.expression.SqmParameter;
@@ -93,21 +94,21 @@ public <X> JpaCteCriteria<X> getCteCriteria(String cteName) {
9394

9495
@Override
9596
public <X> JpaCteCriteria<X> with(AbstractQuery<X> criteria) {
96-
return withInternal( Long.toString( System.nanoTime() ), criteria );
97+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), criteria );
9798
}
9899

99100
@Override
100101
public <X> JpaCteCriteria<X> withRecursiveUnionAll(
101102
AbstractQuery<X> baseCriteria,
102103
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
103-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, false, recursiveCriteriaProducer );
104+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, false, recursiveCriteriaProducer );
104105
}
105106

106107
@Override
107108
public <X> JpaCteCriteria<X> withRecursiveUnionDistinct(
108109
AbstractQuery<X> baseCriteria,
109110
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
110-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, true, recursiveCriteriaProducer );
111+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, true, recursiveCriteriaProducer );
111112
}
112113

113114
@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;
@@ -114,21 +115,21 @@ public <X> JpaCteCriteria<X> getCteCriteria(String cteName) {
114115

115116
@Override
116117
public <X> JpaCteCriteria<X> with(AbstractQuery<X> criteria) {
117-
return withInternal( Long.toString( System.nanoTime() ), criteria );
118+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), criteria );
118119
}
119120

120121
@Override
121122
public <X> JpaCteCriteria<X> withRecursiveUnionAll(
122123
AbstractQuery<X> baseCriteria,
123124
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
124-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, false, recursiveCriteriaProducer );
125+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, false, recursiveCriteriaProducer );
125126
}
126127

127128
@Override
128129
public <X> JpaCteCriteria<X> withRecursiveUnionDistinct(
129130
AbstractQuery<X> baseCriteria,
130131
Function<JpaCteCriteria<X>, AbstractQuery<X>> recursiveCriteriaProducer) {
131-
return withInternal( Long.toString( System.nanoTime() ), baseCriteria, true, recursiveCriteriaProducer );
132+
return withInternal( SqmCreationHelper.acquireUniqueAlias(), baseCriteria, true, recursiveCriteriaProducer );
132133
}
133134

134135
@Override

0 commit comments

Comments
 (0)