Skip to content

Commit 36261a9

Browse files
committed
HHH-19449 have BindableType inherit JPA's Type
1 parent 697ab48 commit 36261a9

28 files changed

+146
-62
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* @author Steve Ebersole
1313
*/
1414
public interface SimpleDomainType<J>
15-
extends DomainType<J>, BindableType<J>, jakarta.persistence.metamodel.Type<J> {
15+
extends DomainType<J>, BindableType<J> {
1616
@Override
1717
default Class<J> getBindableJavaType() {
1818
return getJavaType();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public PersistenceType getPersistenceType() {
9191

9292
@Override
9393
public Class<Object[]> getJavaType() {
94-
return this.getExpressibleJavaType().getJavaTypeClass();
94+
return getExpressibleJavaType().getJavaTypeClass();
9595
}
9696

9797
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public JavaType<J> getExpressibleJavaType() {
4646

4747
@Override
4848
public Class<J> getJavaType() {
49-
return this.getExpressibleJavaType().getJavaTypeClass();
49+
return getExpressibleJavaType().getJavaTypeClass();
5050
}
5151

5252
@Override

hibernate-core/src/main/java/org/hibernate/query/BindableType.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.query;
66

7+
import jakarta.persistence.metamodel.Type;
78
import org.hibernate.Incubating;
89

910
/**
@@ -21,9 +22,14 @@
2122
* @author Steve Ebersole
2223
*/
2324
@Incubating
24-
public interface BindableType<J> {
25+
public interface BindableType<J> extends Type<J> {
2526
/**
2627
* The expected Java type of the argument to the query parameter.
2728
*/
2829
Class<J> getBindableJavaType();
30+
31+
@Override
32+
default Class<J> getJavaType() {
33+
return getBindableJavaType();
34+
}
2935
}

hibernate-core/src/main/java/org/hibernate/query/criteria/JpaTupleElement.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ public interface JpaTupleElement<T> extends TupleElement<T>, JpaCriteriaNode {
2121
@Override
2222
default @Nullable Class<? extends T> getJavaType() {
2323
// todo (6.0) : can this signature just return `Class<T>`?
24-
return getJavaTypeDescriptor() == null ? null : getJavaTypeDescriptor().getJavaTypeClass();
24+
final JavaType<T> javaType = getJavaTypeDescriptor();
25+
return javaType == null ? null : javaType.getJavaTypeClass();
2526
}
2627

2728
default String getJavaTypeName() {
28-
return getJavaTypeDescriptor() == null ? null : getJavaTypeDescriptor().getTypeName();
29+
final JavaType<T> javaType = getJavaTypeDescriptor();
30+
return javaType == null ? null : javaType.getTypeName();
2931
}
3032

3133
default boolean isEnum() {

hibernate-core/src/main/java/org/hibernate/query/specification/internal/SelectionSpecificationImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.hibernate.SharedSessionContract;
1515
import org.hibernate.StatelessSession;
1616
import org.hibernate.engine.spi.SharedSessionContractImplementor;
17-
import org.hibernate.internal.util.collections.CollectionHelper;
1817
import org.hibernate.query.IllegalSelectQueryException;
1918
import org.hibernate.query.Order;
2019
import org.hibernate.query.SelectionQuery;
@@ -44,6 +43,7 @@
4443
import java.util.Set;
4544
import java.util.function.BiConsumer;
4645

46+
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
4747
import static org.hibernate.query.sqm.internal.SqmUtil.validateCriteriaQuery;
4848
import static org.hibernate.query.sqm.tree.SqmCopyContext.noParamCopyContext;
4949

@@ -299,7 +299,7 @@ private void validateResultType(
299299

300300
final SqmSelectClause sqmSelectClause = sqmStatement.getQuerySpec().getSelectClause();
301301
final List<SqmSelection<?>> sqmSelections = sqmSelectClause.getSelections();
302-
if ( CollectionHelper.isEmpty( sqmSelections ) ) {
302+
if ( isEmpty( sqmSelections ) ) {
303303
// implicit select clause, verify that resultType matches the root type
304304
if ( resultType.isAssignableFrom( rootJavaType ) ) {
305305
// it does, we are fine

hibernate-core/src/main/java/org/hibernate/query/sqm/SqmBindable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
import org.hibernate.query.spi.BindingContext;
99

1010
/**
11-
* @param <J>
11+
* An SQM node which may be used to disambiguate the type of an argument to a query parameter.
12+
*
1213
* @author Gavin King
14+
*
1315
* @since 7.0
1416
*/
1517
public interface SqmBindable<J> extends SqmExpressible<J>, BindableTypeImplementor<J> {

hibernate-core/src/main/java/org/hibernate/query/sqm/SqmExpressible.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
/**
1212
* Anything in the application domain model that can be used in an
13-
* SQM query as an expression
13+
* SQM query as an expression.
1414
*
1515
* @see SqmExpression#getNodeType
1616
*

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,6 +1653,11 @@ public MultiValueParameterType(Class<T> type) {
16531653
this.javaType = getTypeConfiguration().getJavaTypeRegistry().getDescriptor( type );
16541654
}
16551655

1656+
@Override
1657+
public PersistenceType getPersistenceType() {
1658+
return PersistenceType.BASIC;
1659+
}
1660+
16561661
@Override
16571662
public JavaType<T> getExpressibleJavaType() {
16581663
return javaType;

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.hibernate.query.spi.QueryParameterBindings;
5656
import org.hibernate.query.spi.QueryParameterImplementor;
5757
import org.hibernate.query.sqm.NodeBuilder;
58+
import org.hibernate.query.sqm.SqmBindable;
5859
import org.hibernate.query.sqm.SqmExpressible;
5960
import org.hibernate.query.sqm.SqmPathSource;
6061
import org.hibernate.query.sqm.SqmQuerySource;
@@ -1218,7 +1219,7 @@ private static <T> void verifySelectionType(
12181219
}
12191220

12201221
if ( !jpaCompliance.isJpaQueryComplianceEnabled() ) {
1221-
verifyResultType( expectedResultClass, selection.getExpressible() );
1222+
verifyResultType( expectedResultClass, selection );
12221223
}
12231224
}
12241225

@@ -1239,15 +1240,17 @@ public static boolean isResultTypeAlwaysAllowed(Class<?> expectedResultClass) {
12391240
|| expectedResultClass == Tuple.class;
12401241
}
12411242

1242-
protected static void verifyResultType(Class<?> resultClass, @Nullable SqmExpressible<?> selectionExpressible) {
1243-
if ( selectionExpressible != null ) {
1244-
final JavaType<?> javaType = selectionExpressible.getExpressibleJavaType();
1245-
if ( javaType != null ) {
1246-
final Class<?> javaTypeClass = javaType.getJavaTypeClass();
1247-
if ( javaTypeClass != Object.class ) {
1248-
if ( !isValid( resultClass, selectionExpressible, javaTypeClass, javaType ) ) {
1249-
throwQueryTypeMismatchException( resultClass, selectionExpressible );
1250-
}
1243+
protected static void verifyResultType(Class<?> resultClass, SqmSelectableNode<?> selectableNode) {
1244+
final SqmBindable<?> selectionExpressible = selectableNode.getExpressible();
1245+
final JavaType<?> javaType =
1246+
selectionExpressible == null
1247+
? selectableNode.getNodeJavaType() // for SqmDynamicInstantiation
1248+
: selectionExpressible.getExpressibleJavaType();
1249+
if ( javaType != null ) {
1250+
final Class<?> javaTypeClass = javaType.getJavaTypeClass();
1251+
if ( javaTypeClass != Object.class ) {
1252+
if ( !isValid( resultClass, selectionExpressible, javaTypeClass, javaType ) ) {
1253+
throwQueryTypeMismatchException( resultClass, selectionExpressible, javaTypeClass );
12511254
}
12521255
}
12531256
}
@@ -1313,11 +1316,13 @@ private static boolean isMatchingDateJdbcType(Class<?> resultClass, JdbcType jdb
13131316
}
13141317
}
13151318

1316-
private static void throwQueryTypeMismatchException(Class<?> resultClass, SqmExpressible<?> sqmExpressible) {
1319+
private static void throwQueryTypeMismatchException(
1320+
Class<?> resultClass,
1321+
@Nullable SqmExpressible<?> sqmExpressible, @Nullable Class<?> javaTypeClass) {
13171322
throw new QueryTypeMismatchException( String.format(
13181323
Locale.ROOT,
13191324
"Incorrect query result type: query produces '%s' but type '%s' was given",
1320-
sqmExpressible.getTypeName(),
1325+
sqmExpressible == null ? javaTypeClass.getName() : sqmExpressible.getTypeName(),
13211326
resultClass.getName()
13221327
) );
13231328
}

0 commit comments

Comments
 (0)