diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java b/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java index fc328b2071c5..ba4243cfd321 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java @@ -749,15 +749,10 @@ public CommonQueryContract setParameter(String name, Object value) { } else { final QueryParameterBinding binding = getQueryParameterBindings().getBinding( name ); - final QueryParameter param = binding.getQueryParameter(); - if ( param.allowsMultiValuedBinding() ) { - final BindableType hibernateType = param.getHibernateType(); - if ( hibernateType == null || isInstance( hibernateType, value ) ) { - if ( value instanceof Collection collection - && !isRegisteredAsBasicType( value.getClass() ) ) { - return setParameterList( name, collection ); - } - } + if ( multipleBinding( binding.getQueryParameter(), value ) + && value instanceof Collection collectionValue + && !isRegisteredAsBasicType( value.getClass() ) ) { + return setParameterList( name, collectionValue ); } binding.setBindValue( value, resolveJdbcParameterTypeIfNecessary() ); } @@ -765,6 +760,18 @@ public CommonQueryContract setParameter(String name, Object value) { return this; } + private boolean multipleBinding(QueryParameter param, Object value){ + if ( param.allowsMultiValuedBinding() ) { + final BindableType hibernateType = param.getHibernateType(); + if ( hibernateType == null + || hibernateType instanceof NullSqmExpressible + || isInstance( hibernateType, value ) ) { + return true; + } + } + return false; + } + private void setTypedParameter(String name, TypedParameterValue typedValue) { final BindableType type = typedValue.getType(); setParameter( name, typedValue.getValue(), type != null ? type : typedValue.getTypeReference() ); @@ -815,17 +822,10 @@ public CommonQueryContract setParameter(int position, Object value) { } else { final QueryParameterBinding binding = getQueryParameterBindings().getBinding( position ); - final QueryParameter param = binding.getQueryParameter(); - if ( param.allowsMultiValuedBinding() ) { - final BindableType hibernateType = param.getHibernateType(); - if ( hibernateType == null - || hibernateType instanceof NullSqmExpressible - || isInstance( hibernateType, value ) ) { - if ( value instanceof Collection collection - && !isRegisteredAsBasicType( value.getClass() ) ) { - return setParameterList( position, collection ); - } - } + if ( multipleBinding( binding.getQueryParameter(), value ) + && value instanceof Collection collectionValue + && !isRegisteredAsBasicType( value.getClass() ) ) { + return setParameterList( position, collectionValue ); } binding.setBindValue( value, resolveJdbcParameterTypeIfNecessary() ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/SelectCaseWhenNullLiteralTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/SelectCaseWhenNullLiteralTest.java index 0fb225e4c357..4aba139cccf1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/SelectCaseWhenNullLiteralTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/SelectCaseWhenNullLiteralTest.java @@ -82,6 +82,30 @@ public void testSelectCaseWhenNullLiteralWithParameters(SessionFactoryScope scop ); } + @Test + @JiraKey( "HHH-19291" ) + public void testSelectCaseWhenNullLiteralWithParametersWithNamedParameters(SessionFactoryScope scope) { + scope.inTransaction( + session -> { + List result = session.createQuery( "select case when 1=1 then :value else null end from Person p" ) + .setParameter( "value", 2 ) + .list(); + assertThat( result.size(), is( 1 ) ); + assertThat( result.get( 0 ), is( 2 ) ); + } + ); + + scope.inTransaction( + session -> { + List result = session.createQuery( "select count(case when 1=1 then :value else null end) from Person p" ) + .setParameter( "value", 2 ) + .list(); + assertThat( result.size(), is( 1 ) ); + assertThat( result.get( 0 ), is( 1L ) ); + } + ); + } + @Entity(name = "Person") @Table(name = "PERSON_TABLE") public static class Person {