Skip to content

Commit 98ab8f0

Browse files
committed
HHH-19906 Add test for issue
1 parent 1454a3e commit 98ab8f0

File tree

1 file changed

+95
-4
lines changed

1 file changed

+95
-4
lines changed

hibernate-core/src/test/java/org/hibernate/orm/test/util/DescriptiveJsonGeneratingVisitorSmokeTest.java

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@
1313
import jakarta.persistence.Id;
1414
import jakarta.persistence.ManyToOne;
1515
import jakarta.persistence.OneToMany;
16+
import org.hibernate.annotations.JdbcTypeCode;
1617
import org.hibernate.engine.spi.SessionFactoryImplementor;
1718
import org.hibernate.persister.entity.EntityPersister;
19+
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
1820
import org.hibernate.testing.orm.junit.DomainModel;
21+
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
1922
import org.hibernate.testing.orm.junit.SessionFactory;
2023
import org.hibernate.testing.orm.junit.SessionFactoryScope;
24+
import org.hibernate.type.SqlTypes;
2125
import org.hibernate.type.descriptor.jdbc.spi.DescriptiveJsonGeneratingVisitor;
2226
import org.hibernate.type.format.StringJsonDocumentWriter;
2327
import org.junit.jupiter.api.AfterAll;
@@ -26,6 +30,8 @@
2630

2731
import java.io.Serializable;
2832
import java.util.ArrayList;
33+
import java.util.Arrays;
34+
import java.util.Collection;
2935
import java.util.List;
3036
import java.util.Map;
3137
import java.util.UUID;
@@ -34,12 +40,14 @@
3440
import static org.assertj.core.api.Assertions.fail;
3541
import 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)
4351
public 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

Comments
 (0)