1313import jakarta .persistence .Id ;
1414import jakarta .persistence .ManyToOne ;
1515import jakarta .persistence .OneToMany ;
16+ import org .hibernate .annotations .JdbcTypeCode ;
1617import org .hibernate .engine .spi .SessionFactoryImplementor ;
1718import org .hibernate .persister .entity .EntityPersister ;
19+ import org .hibernate .testing .orm .junit .DialectFeatureChecks ;
1820import org .hibernate .testing .orm .junit .DomainModel ;
21+ import org .hibernate .testing .orm .junit .RequiresDialectFeature ;
1922import org .hibernate .testing .orm .junit .SessionFactory ;
2023import org .hibernate .testing .orm .junit .SessionFactoryScope ;
24+ import org .hibernate .type .SqlTypes ;
2125import org .hibernate .type .descriptor .jdbc .spi .DescriptiveJsonGeneratingVisitor ;
2226import org .hibernate .type .format .StringJsonDocumentWriter ;
2327import org .junit .jupiter .api .AfterAll ;
2630
2731import java .io .Serializable ;
2832import java .util .ArrayList ;
33+ import java .util .Arrays ;
34+ import java .util .Collection ;
2935import java .util .List ;
3036import java .util .Map ;
3137import java .util .UUID ;
3440import static org .assertj .core .api .Assertions .fail ;
3541import static org .junit .jupiter .api .Assertions .assertDoesNotThrow ;
3642
37- @ DomainModel ( annotatedClasses = {
43+ @ DomainModel (annotatedClasses = {
3844 DescriptiveJsonGeneratingVisitorSmokeTest .Company .class ,
3945 DescriptiveJsonGeneratingVisitorSmokeTest .Address .class ,
4046 DescriptiveJsonGeneratingVisitorSmokeTest .Employee .class ,
41- } )
47+ DescriptiveJsonGeneratingVisitorSmokeTest .EntityOfArrays .class ,
48+ })
4249@ SessionFactory
50+ @ RequiresDialectFeature (feature = DialectFeatureChecks .SupportsJsonArray .class )
4351public class DescriptiveJsonGeneratingVisitorSmokeTest {
4452 private final DescriptiveJsonGeneratingVisitor visitor = new DescriptiveJsonGeneratingVisitor ();
4553
@@ -52,7 +60,7 @@ public void testCompany(SessionFactoryScope scope) {
5260 .findEntityDescriptor ( Company .class );
5361
5462 scope .inTransaction ( session -> {
55- final Company company = session .createQuery (
63+ final Company company = session .createSelectionQuery (
5664 "from Company where id = 1" ,
5765 Company .class
5866 ).getSingleResult ();
@@ -84,7 +92,7 @@ public void testCompanyFetchEmployees(SessionFactoryScope scope) {
8492 .findEntityDescriptor ( Company .class );
8593
8694 scope .inTransaction ( session -> {
87- final Company company = session .createQuery (
95+ final Company company = session .createSelectionQuery (
8896 "from Company c join fetch c.employees where c.id = 1" ,
8997 Company .class
9098 ).getSingleResult ();
@@ -115,13 +123,78 @@ public void testCompanyFetchEmployees(SessionFactoryScope scope) {
115123 } );
116124 }
117125
126+ @ Test
127+ public void testEntityOfArrays (SessionFactoryScope scope ) {
128+ final SessionFactoryImplementor sessionFactory = scope .getSessionFactory ();
129+ final EntityPersister entityDescriptor = sessionFactory .getMappingMetamodel ()
130+ .findEntityDescriptor ( EntityOfArrays .class );
131+
132+ scope .inTransaction ( session -> {
133+ final var entity = session .createSelectionQuery (
134+ "from EntityOfArrays e where id = 1" ,
135+ EntityOfArrays .class
136+ ).getSingleResult ();
137+
138+ try {
139+ final StringJsonDocumentWriter writer = new StringJsonDocumentWriter ();
140+ visitor .visit ( entityDescriptor .getEntityMappingType (), entity , sessionFactory .getWrapperOptions (), writer );
141+ final String result = writer .toString ();
142+
143+ final JsonNode jsonNode = mapper .readTree ( result );
144+ System .out .println ("Result: " +jsonNode .toPrettyString ());
145+
146+ assertJsonArray ( jsonNode .get ( "integerArray" ), Arrays .asList ( 1 , null , 3 ) );
147+ assertJsonArray ( jsonNode .get ( "stringCollectionArray" ), List .of ( "one" , "two" , "three" ) );
148+ assertJsonArray ( jsonNode .get ( "longArray" ), List .of ( 10L , 20L , 30L ) );
149+ assertJsonArray ( jsonNode .get ( "booleanListArray" ), List .of ( true , false , true ) );
150+ }
151+ catch (Exception e ) {
152+ fail ( "Test failed with exception" , e );
153+ }
154+ } );
155+ }
156+
157+ private static void assertJsonArray (JsonNode jsonNode , List <?> expectedValues ) {
158+ assertThat ( jsonNode .isArray () ).isTrue ();
159+ assertThat ( jsonNode .size () ).isEqualTo ( expectedValues .size () );
160+ for (int i = 0 ; i < expectedValues .size (); i ++) {
161+ final Object expectedValue = expectedValues .get ( i );
162+ final JsonNode element = jsonNode .get ( i );
163+ if ( expectedValue == null ) {
164+ assertThat ( element .isNull () ).isTrue ();
165+ }
166+ else if ( expectedValue instanceof Boolean ) {
167+ assertThat ( element .booleanValue () ).isEqualTo ( expectedValue );
168+ }
169+ else if ( expectedValue instanceof Integer ) {
170+ assertThat ( element .intValue () ).isEqualTo ( expectedValue );
171+ }
172+ else if ( expectedValue instanceof Long ) {
173+ assertThat ( element .longValue () ).isEqualTo ( expectedValue );
174+ }
175+ else if ( expectedValue instanceof String ) {
176+ assertThat ( element .textValue () ).isEqualTo ( expectedValue );
177+ }
178+ else {
179+ fail ( "Unsupported element type: " + expectedValue .getClass () );
180+ }
181+ }
182+ }
183+
118184 @ BeforeAll
119185 public void beforeAll (SessionFactoryScope scope ) {
120186 scope .inTransaction ( session -> {
121187 final Company rh = new Company ( 1L , "Red Hat" , new Address ( "Milan" , "Via Gustavo Fara" ) );
122188 session .persist ( rh );
123189 session .persist ( new Employee ( UUID .randomUUID (), "Marco" , "Belladelli" , 100_000 , rh ) );
124190 session .persist ( new Employee ( UUID .randomUUID (), "Matteo" , "Cauzzi" , 50_000 , rh ) );
191+ final var ofArrays = new EntityOfArrays ();
192+ ofArrays .id = 1L ;
193+ ofArrays .integerArray = new Integer [] { 1 , null , 3 };
194+ ofArrays .stringCollectionArray = List .of ( "one" , "two" , "three" );
195+ ofArrays .longArray = new long [] { 10 , 20 , 30 };
196+ ofArrays .booleanListArray = List .of ( true , false , true );
197+ session .persist ( ofArrays );
125198 } );
126199 }
127200
@@ -276,4 +349,22 @@ public void setCompany(Company company) {
276349 this .company = company ;
277350 }
278351 }
352+
353+ @ Entity (name = "EntityOfArrays" )
354+ static class EntityOfArrays {
355+ @ Id
356+ private Long id ;
357+
358+ @ JdbcTypeCode (SqlTypes .ARRAY )
359+ private Integer [] integerArray ;
360+
361+ @ JdbcTypeCode (SqlTypes .ARRAY )
362+ private Collection <String > stringCollectionArray ;
363+
364+ @ JdbcTypeCode (SqlTypes .JSON_ARRAY )
365+ private long [] longArray ;
366+
367+ @ JdbcTypeCode (SqlTypes .JSON_ARRAY )
368+ private List <Boolean > booleanListArray ;
369+ }
279370}
0 commit comments