diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayToStringFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayToStringFunction.java index ff4ef67d8597..654fb80ec92c 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayToStringFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayToStringFunction.java @@ -32,8 +32,7 @@ public ArrayToStringFunction(TypeConfiguration typeConfiguration) { "array_to_string", FunctionKind.NORMAL, StandardArgumentsValidators.composite( - new ArgumentTypesValidator( StandardArgumentsValidators.between( 2, 3 ), ANY, STRING, ANY ), - new ArrayAndElementArgumentValidator( 0, 2 ) + new ArgumentTypesValidator( StandardArgumentsValidators.between( 2, 3 ), ANY, STRING, ANY ) ), StandardFunctionReturnTypeResolvers.invariant( typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING ) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2ArrayToStringFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2ArrayToStringFunction.java index 3b3d1bec2c67..b097265ade6d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2ArrayToStringFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2ArrayToStringFunction.java @@ -40,13 +40,13 @@ public void render( arrayExpression.accept( walker ); sqlAppender.append( " is not null then coalesce((select listagg(" ); if ( defaultExpression != null ) { - sqlAppender.append( "coalesce(" ); + sqlAppender.append( "coalesce(cast(" ); } sqlAppender.append( "array_get(" ); arrayExpression.accept( walker ); sqlAppender.append(",i.idx)" ); if ( defaultExpression != null ) { - sqlAppender.append( "," ); + sqlAppender.append( " as varchar2)," ); defaultExpression.accept( walker ); sqlAppender.append( ")" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/HSQLArrayToStringFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/HSQLArrayToStringFunction.java index ff9ef8e54480..a94c79f85381 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/HSQLArrayToStringFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/HSQLArrayToStringFunction.java @@ -36,11 +36,11 @@ public void render( arrayExpression.accept( walker ); sqlAppender.append( " is not null then coalesce((select group_concat(" ); if ( defaultExpression != null ) { - sqlAppender.append( "coalesce(" ); + sqlAppender.append( "coalesce(cast(" ); } sqlAppender.append( "t.val" ); if ( defaultExpression != null ) { - sqlAppender.append( "," ); + sqlAppender.append( " as varchar)," ); defaultExpression.accept( walker ); sqlAppender.append( ")" ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/type/BooleanArrayToStringTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/type/BooleanArrayToStringTest.java index db6ba058e911..42a55d85cef1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/type/BooleanArrayToStringTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/type/BooleanArrayToStringTest.java @@ -7,6 +7,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import org.hibernate.dialect.OracleDialect; +import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.Jira; @@ -37,9 +38,17 @@ public void testBooleanArrayToStringFunction(SessionFactoryScope scope) { ); scope.inTransaction( session -> { + String expected = session.getDialect().getClass().isAssignableFrom( PostgreSQLDialect.class ) ? + "f;f;null;t" : "false;false;null;true"; + String s = session.createQuery( "select array_to_string(t.theBoolean, ';', 'null') " + "from TestEntity t", String.class ).getSingleResult(); - Assertions.assertEquals("false;false;null;true", s); + Assertions.assertEquals(expected, s.toLowerCase()); +// todo: review these other cases +// String s = session.createQuery( "select array_to_string(t.theBoolean, ';', null) " +// + "from TestEntity t", String.class ).getSingleResult(); +// String s = session.createQuery( "select array_to_string(t.theBoolean, ';') " +// + "from TestEntity t", String.class ).getSingleResult(); } ); scope.inTransaction(