From 5f99bf89b74d6d26a2c4cd6c7cb77eb7c96ee02c Mon Sep 17 00:00:00 2001 From: stringintech Date: Sat, 28 Dec 2024 00:21:56 +0330 Subject: [PATCH] HHH-18981 test reproducing the issue --- .../ArrayToStringWithArrayAggregateTest.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayToStringWithArrayAggregateTest.java diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayToStringWithArrayAggregateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayToStringWithArrayAggregateTest.java new file mode 100644 index 000000000000..64f2c215ed26 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayToStringWithArrayAggregateTest.java @@ -0,0 +1,129 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.function.array; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Tuple; +import org.hibernate.query.criteria.JpaCriteriaQuery; +import org.hibernate.query.criteria.JpaCteCriteria; +import org.hibernate.query.criteria.JpaRoot; +import org.hibernate.query.sqm.NodeBuilder; +import org.hibernate.testing.orm.junit.DialectFeatureChecks; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.FailureExpected; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.RequiresDialectFeature; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Kowsar Atazadeh + */ +@DomainModel(annotatedClasses = ArrayToStringWithArrayAggregateTest.Book.class) +@SessionFactory +@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsArrayToString.class) +@JiraKey("HHH-18981") +public class ArrayToStringWithArrayAggregateTest { + + @BeforeEach + public void prepareData(SessionFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Book( 1, "title1" ) ); + em.persist( new Book( 2, "title2" ) ); + } ); + } + + @AfterEach + public void cleanup(SessionFactoryScope scope) { + scope.inTransaction( em -> { + em.createMutationQuery( "delete from Book" ).executeUpdate(); + } ); + } + + @Test + @FailureExpected(jiraKey = "HHH-18981", reason = "throws an ArrayIndexOutOfBoundsException") + public void test(SessionFactoryScope scope) { + scope.inSession( em -> { + final NodeBuilder cb = (NodeBuilder) em.getCriteriaBuilder(); + final JpaCriteriaQuery q = cb.createTupleQuery(); + JpaRoot root = q.from( Book.class ); + + q.multiselect( + cb.arrayToString( + cb.arrayAgg( cb.asc( root.get( "title" ) ), root.get( "title" ) ), + "," + ).alias( "titles" ) + ); + List list = em.createQuery( q ).getResultList(); + String titles = list.getFirst().get( "titles", String.class ); + assertThat( titles ).isEqualTo( "title_1,title_2" ); + } ); + } + + @Test + public void testWithCte(SessionFactoryScope scope) { + scope.inSession( em -> { + final NodeBuilder cb = (NodeBuilder) em.getCriteriaBuilder(); + + JpaCriteriaQuery cteQuery = cb.createTupleQuery(); + JpaRoot cteRoot = cteQuery.from( Book.class ); + cteQuery.multiselect( + cb.arrayAgg( cb.asc( cteRoot.get( "title" ) ), cteRoot.get( "title" ) ) + .alias( "titles_array" ) + ); + + JpaCriteriaQuery query = cb.createTupleQuery(); + JpaCteCriteria titlesCte = query.with( cteQuery ); + JpaRoot root = query.from( titlesCte ); + query.multiselect( + cb.arrayToString( root.get( "titles_array" ), cb.literal( "," ) ) + .alias( "titles" ) + ); + + List list = em.createQuery( query ).getResultList(); + String titles = list.getFirst().get( "titles", String.class ); + assertThat( titles ).isEqualTo( "title1,title2" ); + } ); + } + + @Entity(name = "Book") + public static class Book { + @Id + private Integer id; + private String title; + + public Book() { + } + + public Book(Integer id, String title) { + this.id = id; + this.title = title; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + } +}