mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-17 00:24:57 +00:00
HHH-17355 Support binding single element value for basic plural parameter types
This commit is contained in:
parent
e8518a6073
commit
c257be699a
@ -14,6 +14,7 @@
|
|||||||
import org.hibernate.query.BindableType;
|
import org.hibernate.query.BindableType;
|
||||||
import org.hibernate.query.QueryArgumentException;
|
import org.hibernate.query.QueryArgumentException;
|
||||||
import org.hibernate.query.sqm.SqmExpressible;
|
import org.hibernate.query.sqm.SqmExpressible;
|
||||||
|
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
import jakarta.persistence.TemporalType;
|
import jakarta.persistence.TemporalType;
|
||||||
@ -141,6 +142,13 @@ else if ( temporalType != null ) {
|
|||||||
|
|
||||||
return parameterDeclarationIsTemporal && bindIsTemporal;
|
return parameterDeclarationIsTemporal && bindIsTemporal;
|
||||||
}
|
}
|
||||||
|
// Allow binding a single element for a basic plural parameter type
|
||||||
|
else if ( expectedJavaType instanceof BasicPluralJavaType<?> ) {
|
||||||
|
final JavaType<?> elementJavaType = ( (BasicPluralJavaType<?>) expectedJavaType ).getElementJavaType();
|
||||||
|
if ( elementJavaType.isInstance( value ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.hibernate.type;
|
package org.hibernate.type;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
|
||||||
@ -54,6 +56,20 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
|
|||||||
return (BasicType<X>) this;
|
return (BasicType<X>) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object disassemble(Object value, SharedSessionContractImplementor session) {
|
||||||
|
if ( value == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ( baseDescriptor.isInstance( (E) value ) ) {
|
||||||
|
// Support binding a single element as parameter value
|
||||||
|
final Object array = Array.newInstance( baseDescriptor.getJavaType(), 1 );
|
||||||
|
Array.set( array, 0, value );
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
return o == this || o.getClass() == BasicArrayType.class
|
return o == this || o.getClass() == BasicArrayType.class
|
||||||
|
@ -6,9 +6,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.hibernate.type;
|
package org.hibernate.type;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
import org.hibernate.type.descriptor.java.spi.BasicCollectionJavaType;
|
import org.hibernate.type.descriptor.java.spi.BasicCollectionJavaType;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
||||||
@ -75,6 +77,21 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
|
|||||||
return (BasicType<X>) this;
|
return (BasicType<X>) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object disassemble(Object value, SharedSessionContractImplementor session) {
|
||||||
|
if ( value == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ( baseDescriptor.isInstance( (E) value ) ) {
|
||||||
|
// Support binding a single element as parameter value
|
||||||
|
final BasicCollectionJavaType<C, E> javaType = (BasicCollectionJavaType<C, E>) getJavaTypeDescriptor();
|
||||||
|
final C collection = javaType.getSemantics().instantiateRaw( 1, null );
|
||||||
|
collection.add( (E) value );
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
return o == this || o.getClass() == BasicCollectionType.class
|
return o == this || o.getClass() == BasicCollectionType.class
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.hibernate.type;
|
package org.hibernate.type;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.type.descriptor.ValueBinder;
|
import org.hibernate.type.descriptor.ValueBinder;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
import org.hibernate.type.descriptor.ValueExtractor;
|
||||||
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
|
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
|
||||||
@ -76,6 +78,20 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
|
|||||||
return (BasicType<X>) this;
|
return (BasicType<X>) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object disassemble(Object value, SharedSessionContractImplementor session) {
|
||||||
|
if ( value == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ( baseDescriptor.isInstance( (E) value ) ) {
|
||||||
|
// Support binding a single element as parameter value
|
||||||
|
final Object array = Array.newInstance( baseDescriptor.getJavaType(), 1 );
|
||||||
|
Array.set( array, 0, value );
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BasicValueConverter<T, ?> getValueConverter() {
|
public BasicValueConverter<T, ?> getValueConverter() {
|
||||||
return converter;
|
return converter;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user