Skip to content

Commit c257be6

Browse files
committed
HHH-17355 Support binding single element value for basic plural parameter types
1 parent e8518a6 commit c257be6

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindingValidator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.query.BindableType;
1515
import org.hibernate.query.QueryArgumentException;
1616
import org.hibernate.query.sqm.SqmExpressible;
17+
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
1718
import org.hibernate.type.descriptor.java.JavaType;
1819

1920
import jakarta.persistence.TemporalType;
@@ -141,6 +142,13 @@ else if ( temporalType != null ) {
141142

142143
return parameterDeclarationIsTemporal && bindIsTemporal;
143144
}
145+
// Allow binding a single element for a basic plural parameter type
146+
else if ( expectedJavaType instanceof BasicPluralJavaType<?> ) {
147+
final JavaType<?> elementJavaType = ( (BasicPluralJavaType<?>) expectedJavaType ).getElementJavaType();
148+
if ( elementJavaType.isInstance( value ) ) {
149+
return true;
150+
}
151+
}
144152

145153
return false;
146154
}

hibernate-core/src/main/java/org/hibernate/type/BasicArrayType.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
*/
77
package org.hibernate.type;
88

9+
import java.lang.reflect.Array;
910
import java.util.Objects;
1011

12+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1113
import org.hibernate.type.descriptor.java.JavaType;
1214
import org.hibernate.type.descriptor.jdbc.JdbcType;
1315
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
@@ -54,6 +56,20 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
5456
return (BasicType<X>) this;
5557
}
5658

59+
@Override
60+
public Object disassemble(Object value, SharedSessionContractImplementor session) {
61+
if ( value == null ) {
62+
return null;
63+
}
64+
if ( baseDescriptor.isInstance( (E) value ) ) {
65+
// Support binding a single element as parameter value
66+
final Object array = Array.newInstance( baseDescriptor.getJavaType(), 1 );
67+
Array.set( array, 0, value );
68+
return array;
69+
}
70+
return value;
71+
}
72+
5773
@Override
5874
public boolean equals(Object o) {
5975
return o == this || o.getClass() == BasicArrayType.class

hibernate-core/src/main/java/org/hibernate/type/BasicCollectionType.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
*/
77
package org.hibernate.type;
88

9+
import java.lang.reflect.Array;
910
import java.util.Collection;
1011
import java.util.Objects;
1112

13+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1214
import org.hibernate.type.descriptor.java.JavaType;
1315
import org.hibernate.type.descriptor.java.spi.BasicCollectionJavaType;
1416
import org.hibernate.type.descriptor.jdbc.JdbcType;
@@ -75,6 +77,21 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
7577
return (BasicType<X>) this;
7678
}
7779

80+
@Override
81+
public Object disassemble(Object value, SharedSessionContractImplementor session) {
82+
if ( value == null ) {
83+
return null;
84+
}
85+
if ( baseDescriptor.isInstance( (E) value ) ) {
86+
// Support binding a single element as parameter value
87+
final BasicCollectionJavaType<C, E> javaType = (BasicCollectionJavaType<C, E>) getJavaTypeDescriptor();
88+
final C collection = javaType.getSemantics().instantiateRaw( 1, null );
89+
collection.add( (E) value );
90+
return collection;
91+
}
92+
return value;
93+
}
94+
7895
@Override
7996
public boolean equals(Object o) {
8097
return o == this || o.getClass() == BasicCollectionType.class

hibernate-core/src/main/java/org/hibernate/type/ConvertedBasicArrayType.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
*/
77
package org.hibernate.type;
88

9+
import java.lang.reflect.Array;
910
import java.util.Objects;
1011

12+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1113
import org.hibernate.type.descriptor.ValueBinder;
1214
import org.hibernate.type.descriptor.ValueExtractor;
1315
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
@@ -76,6 +78,20 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
7678
return (BasicType<X>) this;
7779
}
7880

81+
@Override
82+
public Object disassemble(Object value, SharedSessionContractImplementor session) {
83+
if ( value == null ) {
84+
return null;
85+
}
86+
if ( baseDescriptor.isInstance( (E) value ) ) {
87+
// Support binding a single element as parameter value
88+
final Object array = Array.newInstance( baseDescriptor.getJavaType(), 1 );
89+
Array.set( array, 0, value );
90+
return array;
91+
}
92+
return value;
93+
}
94+
7995
@Override
8096
public BasicValueConverter<T, ?> getValueConverter() {
8197
return converter;

0 commit comments

Comments
 (0)