Skip to content

Commit 4d693f4

Browse files
committed
HHH-17283 Correct tuple length for subqueries and attribute joins
1 parent c00ca3e commit 4d693f4

File tree

7 files changed

+34
-32
lines changed

7 files changed

+34
-32
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/DomainType.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@ public interface DomainType<J> extends SqmExpressible<J> {
3030
default DomainType<J> getSqmType() {
3131
return this;
3232
}
33+
34+
default int getTupleLength() {
35+
return 1;
36+
}
3337
}

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88

99
import java.io.Serializable;
1010

11-
import org.hibernate.graph.internal.SubGraphImpl;
12-
import org.hibernate.graph.spi.SubGraphImplementor;
1311
import org.hibernate.metamodel.model.domain.AbstractManagedType;
12+
import org.hibernate.metamodel.model.domain.DomainType;
1413
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
1514
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
1615
import org.hibernate.type.descriptor.java.JavaType;
1716

17+
import jakarta.persistence.metamodel.SingularAttribute;
18+
import jakarta.persistence.metamodel.Type;
19+
1820
/**
1921
* Implementation of {@link jakarta.persistence.metamodel.EmbeddableType}.
2022
*
@@ -39,4 +41,12 @@ public EmbeddableTypeImpl(
3941
public PersistenceType getPersistenceType() {
4042
return PersistenceType.EMBEDDABLE;
4143
}
44+
45+
public int getTupleLength() {
46+
int count = 0;
47+
for ( SingularAttribute<? super J, ?> attribute : getSingularAttributes() ) {
48+
count += ( (DomainType<?>) attribute.getType() ).getTupleLength();
49+
}
50+
return count;
51+
}
4252
}

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,19 @@
77
package org.hibernate.query.sqm.tree.domain;
88

99
import org.hibernate.metamodel.model.domain.PersistentAttribute;
10-
import org.hibernate.spi.NavigablePath;
1110
import org.hibernate.query.criteria.JpaExpression;
1211
import org.hibernate.query.criteria.JpaPredicate;
1312
import org.hibernate.query.sqm.NodeBuilder;
1413
import org.hibernate.query.sqm.SemanticQueryWalker;
1514
import org.hibernate.query.sqm.SqmJoinable;
1615
import org.hibernate.query.sqm.SqmPathSource;
1716
import org.hibernate.query.sqm.spi.SqmCreationHelper;
18-
import org.hibernate.query.sqm.tree.SqmCopyContext;
1917
import org.hibernate.query.sqm.tree.SqmJoinType;
2018
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
2119
import org.hibernate.query.sqm.tree.from.SqmFrom;
22-
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
20+
import org.hibernate.spi.NavigablePath;
2321
import org.hibernate.type.descriptor.java.JavaType;
2422

25-
import org.jboss.logging.Logger;
26-
2723
import jakarta.persistence.criteria.Expression;
2824
import jakarta.persistence.criteria.JoinType;
2925
import jakarta.persistence.criteria.Predicate;
@@ -140,5 +136,4 @@ public SqmFrom<?, O> getParent() {
140136
public JoinType getJoinType() {
141137
return getSqmJoinType().getCorrespondingJpaJoinType();
142138
}
143-
144139
}

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

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
*/
77
package org.hibernate.query.sqm.tree.domain;
88

9-
import jakarta.persistence.metamodel.Attribute;
10-
import jakarta.persistence.metamodel.SingularAttribute;
119
import org.hibernate.metamodel.model.domain.DomainType;
1210
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
1311
import org.hibernate.metamodel.model.domain.EntityDomainType;
@@ -22,8 +20,6 @@
2220
import org.hibernate.spi.NavigablePath;
2321
import org.hibernate.type.descriptor.java.JavaType;
2422

25-
import java.util.Set;
26-
2723
/**
2824
* @author Steve Ebersole
2925
*/
@@ -79,21 +75,6 @@ public SqmExpressible<T> getExpressible() {
7975
return this;
8076
}
8177

82-
@Override
83-
public Integer getTupleLength() {
84-
final EmbeddableDomainType<?> sqmPathType = (EmbeddableDomainType<?>) getReferencedPathSource().getSqmPathType();
85-
final Set<? extends SingularAttribute<?, ?>> attributes = sqmPathType.getSingularAttributes();
86-
return length(attributes);
87-
}
88-
89-
private int length(Set<? extends SingularAttribute<?, ?>> attributes) {
90-
int length = 0;
91-
for (Attribute<?, ?> attribute : attributes) {
92-
length += get(attribute.getName()).getTupleLength();
93-
}
94-
return length;
95-
}
96-
9778
@Override
9879
public DomainType<T> getSqmType() {
9980
return getReferencedPathSource().getSqmType();

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ default void visitSubSelectableNodes(Consumer<SqmSelectableNode<?>> jpaSelection
5858
jpaSelectionConsumer.accept( this );
5959
}
6060

61-
default Integer getTupleLength() {
62-
return 1;
63-
}
64-
6561
@Override
6662
SqmExpression<Long> asLong();
6763

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.function.Consumer;
1010
import jakarta.persistence.criteria.Selection;
1111

12+
import org.hibernate.metamodel.model.domain.DomainType;
1213
import org.hibernate.query.criteria.JpaSelection;
1314
import org.hibernate.query.sqm.tree.SqmCopyContext;
1415
import org.hibernate.query.sqm.tree.SqmTypedNode;
@@ -32,4 +33,9 @@ public interface SqmSelectableNode<T> extends JpaSelection<T>, SqmTypedNode<T> {
3233

3334
@Override
3435
SqmSelectableNode<T> copy(SqmCopyContext context);
36+
37+
default Integer getTupleLength() {
38+
final DomainType<T> sqmType = getNodeType() == null ? null : getNodeType().getSqmType();
39+
return sqmType == null ? 1 : sqmType.getTupleLength();
40+
}
3541
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,17 @@ public SqmSubQuery<T> copy(SqmCopyContext context) {
154154
@Override
155155
public Integer getTupleLength() {
156156
final SqmSelectClause selectClause = getQuerySpec().getSelectClause();
157-
return selectClause == null ? null : selectClause.getSelectionItems().size();
157+
return selectClause != null ?
158+
getTupleLength( selectClause.getSelectionItems() ) :
159+
null;
160+
}
161+
162+
private int getTupleLength(List<SqmSelectableNode<?>> selectionItems) {
163+
int count = 0;
164+
for ( SqmSelectableNode<?> selection : selectionItems ) {
165+
count += selection.getTupleLength();
166+
}
167+
return count;
158168
}
159169

160170
@Override

0 commit comments

Comments
 (0)