HHH-17530 Add test for issue

This commit is contained in:
Marco Belladelli 2024-01-03 10:02:36 +01:00 committed by Christian Beikov
parent 363d896f72
commit b1636fc7df
1 changed files with 114 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package org.hibernate.orm.test.jpa.criteria;
import java.util.List;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jira;
import org.hibernate.testing.orm.junit.JiraKey;
import org.hibernate.testing.orm.junit.Jpa;
import org.junit.jupiter.api.BeforeAll;
@ -153,6 +154,96 @@ public class CriteriaWithDynamicInstantiationAndOrderByTest {
);
}
@Test
@Jira( "https://hibernate.atlassian.net/browse/HHH-17530" )
public void testNestedConstruct(EntityManagerFactoryScope scope) {
scope.inTransaction( em -> {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<R1> cq = cb.createQuery( R1.class );
final Root<Item> root = cq.from( Item.class );
final CompoundSelection<R1> construct = cb.construct(
R1.class,
root.get( "id" ),
cb.construct(
R2.class,
root.get( "id" ),
root.get( "name" )
)
);
cq.select( construct );
cq.orderBy( cb.asc( root.get( "id" ) ) );
final R1 result = em.createQuery( cq ).getSingleResult();
assertThat( result.getA() ).isEqualTo( ITEM_ID );
assertThat( result.getR2().getA() ).isEqualTo( ITEM_ID );
assertThat( result.getR2().getB() ).isEqualTo( ITEM_NAME );
} );
}
@Test
@Jira( "https://hibernate.atlassian.net/browse/HHH-17530" )
public void testMultiselectAndNestedConstruct(EntityManagerFactoryScope scope) {
scope.inTransaction( em -> {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Tuple> cq = cb.createQuery( Tuple.class );
final Root<Item> root = cq.from( Item.class );
final CompoundSelection<R1> construct = cb.construct(
R1.class,
root.get( "id" ),
cb.construct(
R2.class,
root.get( "id" ),
root.get( "name" )
)
);
cq.multiselect(
cb.construct( R1.class, root.get( "id" ) ),
construct
);
cq.orderBy( cb.asc( root.get( "id" ) ) );
final Tuple result = em.createQuery( cq ).getSingleResult();
final R1 first = result.get( 0, R1.class );
assertThat( first.getA() ).isEqualTo( ITEM_ID );
final R1 second = result.get( 1, R1.class );
assertThat( second.getA() ).isEqualTo( ITEM_ID );
assertThat( second.getR2().getA() ).isEqualTo( ITEM_ID );
assertThat( second.getR2().getB() ).isEqualTo( ITEM_NAME );
} );
}
@Test
@Jira( "https://hibernate.atlassian.net/browse/HHH-17530" )
public void testDoubleNestedConstruct(EntityManagerFactoryScope scope) {
scope.inTransaction( em -> {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<R1> cq = cb.createQuery( R1.class );
final Root<Item> root = cq.from( Item.class );
final CompoundSelection<R1> construct = cb.construct(
R1.class,
root.get( "id" ),
cb.construct(
R2.class,
root.get( "id" ),
root.get( "name" ),
cb.construct(
R3.class,
root.get( "id" ),
root.get( "name" ),
root.get( "name" )
)
)
);
cq.select( construct );
cq.orderBy( cb.asc( root.get( "id" ) ) );
final R1 result = em.createQuery( cq ).getSingleResult();
assertThat( result.getA() ).isEqualTo( ITEM_ID );
assertThat( result.getR2().getA() ).isEqualTo( ITEM_ID );
assertThat( result.getR2().getB() ).isEqualTo( ITEM_NAME );
assertThat( result.getR2().getR3().getA() ).isEqualTo( ITEM_ID );
assertThat( result.getR2().getR3().getB() ).isEqualTo( ITEM_NAME );
assertThat( result.getR2().getR3().getC() ).isEqualTo( ITEM_NAME );
} );
}
@Entity(name = "Item")
@Table(name = "ITEM_TABLE")
public static class Item {
@ -174,24 +265,43 @@ public class CriteriaWithDynamicInstantiationAndOrderByTest {
public static class R1 {
private Long a;
private R2 r2;
public R1(Long a) {
this.a = a;
}
public R1(Long a, R2 r2) {
this.a = a;
this.r2 = r2;
}
public Long getA() {
return a;
}
public R2 getR2() {
return r2;
}
}
public static class R2 {
private Long a;
private String b;
private R3 r3;
public R2(Long a, String b) {
this.a = a;
this.b = b;
}
public R2(Long a, String b, R3 r3) {
this.a = a;
this.b = b;
this.r3 = r3;
}
public Long getA() {
return a;
}
@ -199,6 +309,10 @@ public class CriteriaWithDynamicInstantiationAndOrderByTest {
public String getB() {
return b;
}
public R3 getR3() {
return r3;
}
}
public static class R3 {