Skip to content

Commit

Permalink
HHH-17355 Support binding single element value for basic plural param…
Browse files Browse the repository at this point in the history
…eter types
  • Loading branch information
beikov committed Nov 6, 2023
1 parent e8518a6 commit c257be6
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.hibernate.query.BindableType;
import org.hibernate.query.QueryArgumentException;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
import org.hibernate.type.descriptor.java.JavaType;

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

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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
*/
package org.hibernate.type;

import java.lang.reflect.Array;
import java.util.Objects;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.descriptor.jdbc.JdbcType;
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
Expand Down Expand Up @@ -54,6 +56,20 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
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
public boolean equals(Object o) {
return o == this || o.getClass() == BasicArrayType.class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
*/
package org.hibernate.type;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Objects;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.descriptor.java.spi.BasicCollectionJavaType;
import org.hibernate.type.descriptor.jdbc.JdbcType;
Expand Down Expand Up @@ -75,6 +77,21 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
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
public boolean equals(Object o) {
return o == this || o.getClass() == BasicCollectionType.class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
*/
package org.hibernate.type;

import java.lang.reflect.Array;
import java.util.Objects;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.ValueBinder;
import org.hibernate.type.descriptor.ValueExtractor;
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
Expand Down Expand Up @@ -76,6 +78,20 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
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
public BasicValueConverter<T, ?> getValueConverter() {
return converter;
Expand Down

0 comments on commit c257be6

Please sign in to comment.