diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/ArrayJdbcType.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/ArrayJdbcType.java index 6f1d3fc74f63..fcffb0657ff7 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/ArrayJdbcType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/ArrayJdbcType.java @@ -169,7 +169,10 @@ protected Object[] getArray(BasicBinder binder, ValueBinder elementBin protected X getArray(BasicExtractor extractor, java.sql.Array array, WrapperOptions options) throws SQLException { final JavaType javaType = extractor.getJavaType(); - if ( array != null && getElementJdbcType() instanceof AggregateJdbcType aggregateJdbcType ) { + if (array != null + && getElementJdbcType() instanceof AggregateJdbcType aggregateJdbcType + && aggregateJdbcType.getEmbeddableMappingType() != null) { + final EmbeddableMappingType embeddableMappingType = aggregateJdbcType.getEmbeddableMappingType(); final Object rawArray = array.getArray(); final Object[] domainObjects = new Object[Array.getLength( rawArray )]; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayAggregateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayAggregateTest.java index e255416ba04f..f1faea74a561 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayAggregateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayAggregateTest.java @@ -4,6 +4,7 @@ */ package org.hibernate.orm.test.function.array; +import java.util.Arrays; import java.util.List; import org.hibernate.boot.ResourceStreamLocator; @@ -11,6 +12,7 @@ import org.hibernate.boot.spi.AdditionalMappingContributor; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; +import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.type.OracleArrayJdbcType; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.SpannerDialect; @@ -18,6 +20,7 @@ import org.hibernate.query.criteria.JpaCriteriaQuery; import org.hibernate.query.criteria.JpaRoot; import org.hibernate.query.sqm.NodeBuilder; +import org.hibernate.testing.orm.junit.RequiresDialect; import org.hibernate.type.SqlTypes; import org.hibernate.type.descriptor.java.ArrayJavaType; import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; @@ -35,6 +38,7 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.Jira; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -170,4 +174,21 @@ public void testNonExistingArrayType(SessionFactoryScope scope) { } ); } + @Test + @Jira("https://hibernate.atlassian.net/browse/HHH-19681") + @RequiresDialect(PostgreSQLDialect.class) + public void testJsonBJdbcArray(SessionFactoryScope scope) { + scope.inTransaction( session -> { + String sql = "select groupId, array_agg(json_values) " + + "from (VALUES (1,'[1,2]'::jsonb),(1,'[10,20]'::jsonb)) as row(groupId,json_values) " + + "group by groupId"; + + List result = session.createNativeQuery(sql, Object[].class).getResultList(); + assertEquals(1,result.size()); + assertEquals(2, result.get(0).length); + assertEquals( 1,result.get(0)[0] ); + assertEquals( "[[1, 2], [10, 20]]", Arrays.toString((String[])result.get(0)[1]) ); + } ); + } + }