From 4c8e72c5ecfa1901298b73cf47e30ff97463b01e Mon Sep 17 00:00:00 2001 From: Cedomir Igaly Date: Wed, 12 Jun 2024 12:49:05 +0200 Subject: [PATCH] HHH-18218 - Improved type resolving when tuple element implements SqmExpressibleAccessor --- .../internal/RowTransformerConstructorImpl.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowTransformerConstructorImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowTransformerConstructorImpl.java index 583ce5270f..0db00d1149 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowTransformerConstructorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowTransformerConstructorImpl.java @@ -14,6 +14,9 @@ import org.hibernate.sql.results.spi.RowTransformer; import java.lang.reflect.Constructor; import java.util.List; +import org.hibernate.query.sqm.SqmExpressible; +import org.hibernate.query.sqm.tree.SqmExpressibleAccessor; + /** * {@link RowTransformer} instantiating an arbitrary class * @@ -28,7 +31,7 @@ public class RowTransformerConstructorImpl implements RowTransformer { final List> elements = tupleMetadata.getList(); final Class[] sig = new Class[elements.size()]; for (int i = 0; i < elements.size(); i++) { - sig[i] = elements.get(i).getJavaType(); + sig[i] = resolveElementJavaType( elements.get( i ) ); } try { constructor = type.getDeclaredConstructor( sig ); @@ -40,6 +43,17 @@ public class RowTransformerConstructorImpl implements RowTransformer { } } + private static Class resolveElementJavaType(TupleElement element) { + if ( element instanceof SqmExpressibleAccessor ) { + SqmExpressible expressible = ( (SqmExpressibleAccessor) element ).getExpressible(); + if ( expressible != null ) { + return expressible.getExpressibleJavaType().getJavaTypeClass(); + } + } + + return element.getJavaType(); + } + @Override public T transformRow(Object[] row) { try {