From 1d46b87008b6e9666bde4564cb323aaff8da8a9a Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Mon, 9 Sep 2024 15:24:13 +0800 Subject: [PATCH] HHH-18575 Fix IllegalStateException while passing multi-valued BigDecimal as parameter Fix ``` java.lang.IllegalStateException: Binding is multi-valued; illegal call to #getBindValue at org.hibernate.query.internal.QueryParameterBindingImpl.getBindValue(QueryParameterBindingImpl.java:100) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.resolveSqmParameter(BaseSqmToSqlAstConverter.java:6283) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeSqmParameter(BaseSqmToSqlAstConverter.java:5861) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeSingleSqmParameter(BaseSqmToSqlAstConverter.java:5950) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.processInSingleParameter(BaseSqmToSqlAstConverter.java:8178) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.processInSingleHqlParameter(BaseSqmToSqlAstConverter.java:8135) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.processInListWithSingleParameter(BaseSqmToSqlAstConverter.java:8124) ``` --- .../query/sqm/sql/BaseSqmToSqlAstConverter.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java index a7b1f3569b..950935888f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java @@ -6293,7 +6293,14 @@ public abstract class BaseSqmToSqlAstConverter extends Base final QueryParameterBinding binding = domainParameterBindings.getBinding( domainParameterXref.getQueryParameter( expression ) ); - final Object bindValue = binding.getBindValue(); + final Object bindValue; + if ( binding.isMultiValued() ) { + final Collection bindValues = binding.getBindValues(); + bindValue = !bindValues.isEmpty() ? bindValues.iterator().next() : null; + } + else { + bindValue = binding.getBindValue(); + } if ( bindValue != null ) { if ( bindValue instanceof BigInteger ) { int precision = bindValue.toString().length() - ( ( (BigInteger) bindValue ).signum() < 0 ? 1 : 0 );