Skip to content

Commit 80c4db7

Browse files
mbelladebeikov
authored andcommitted
HHH-19905 Add test for issue
1 parent 9e756dc commit 80c4db7

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.query.hql;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.ManyToOne;
10+
import org.hibernate.testing.orm.junit.DomainModel;
11+
import org.hibernate.testing.orm.junit.Jira;
12+
import org.hibernate.testing.orm.junit.SessionFactory;
13+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
14+
import org.junit.jupiter.api.AfterAll;
15+
import org.junit.jupiter.api.BeforeAll;
16+
import org.junit.jupiter.api.Test;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
/**
21+
* @author Christian Beikov
22+
*/
23+
@DomainModel(annotatedClasses = {
24+
ImplicitNestedJoinTest.RootEntity.class,
25+
ImplicitNestedJoinTest.FirstLevelReferencedEntity.class,
26+
ImplicitNestedJoinTest.SecondLevelReferencedEntityA.class,
27+
ImplicitNestedJoinTest.SecondLevelReferencedEntityB.class
28+
})
29+
@SessionFactory
30+
@Jira("https://hibernate.atlassian.net/browse/HHH-19905")
31+
public class ImplicitNestedJoinTest {
32+
33+
@Test
34+
public void testInnerAndLeftJoin(SessionFactoryScope scope) {
35+
scope.inSession( session -> {
36+
final var resultList = session.createQuery(
37+
"select r.id from RootEntity r"
38+
+ " join r.firstLevelReference.secondLevelReferenceA sa "
39+
+ " left join r.firstLevelReference.secondLevelReferenceB sb",
40+
Long.class
41+
).getResultList();
42+
assertThat( resultList ).hasSize( 2 ).containsExactlyInAnyOrder( 1L, 2L );
43+
} );
44+
}
45+
46+
@Test
47+
public void testLeftAndInnerJoin(SessionFactoryScope scope) {
48+
scope.inSession( session -> {
49+
final var resultList = session.createQuery(
50+
"select r.id from RootEntity r"
51+
+ " left join r.firstLevelReference.secondLevelReferenceA sa "
52+
+ " join r.firstLevelReference.secondLevelReferenceB sb",
53+
Long.class
54+
).getResultList();
55+
assertThat( resultList ).hasSize( 1 ).containsExactly( 1L );
56+
} );
57+
}
58+
59+
@Test
60+
public void testBothInnerJoins(SessionFactoryScope scope) {
61+
scope.inSession( session -> {
62+
final var resultList = session.createQuery(
63+
"select r.id from RootEntity r"
64+
+ " join r.firstLevelReference.secondLevelReferenceA sa "
65+
+ " join r.firstLevelReference.secondLevelReferenceB sb",
66+
Long.class
67+
).getResultList();
68+
assertThat( resultList ).hasSize( 1 ).containsExactly( 1L );
69+
} );
70+
}
71+
72+
@BeforeAll
73+
public void setUp(SessionFactoryScope scope) {
74+
scope.inTransaction( session -> {
75+
// create some test data : one first level reference with both second level references, and
76+
// another first level reference with only one second level reference
77+
SecondLevelReferencedEntityA secondLevelA = new SecondLevelReferencedEntityA();
78+
secondLevelA.id = 1L;
79+
secondLevelA.name = "Second Level A";
80+
session.persist( secondLevelA );
81+
SecondLevelReferencedEntityB secondLevelB = new SecondLevelReferencedEntityB();
82+
secondLevelB.id = 1L;
83+
session.persist( secondLevelB );
84+
FirstLevelReferencedEntity firstLevel1 = new FirstLevelReferencedEntity();
85+
firstLevel1.id = 1L;
86+
firstLevel1.secondLevelReferenceA = secondLevelA;
87+
firstLevel1.secondLevelReferenceB = secondLevelB;
88+
session.persist( firstLevel1 );
89+
RootEntity root1 = new RootEntity();
90+
root1.id = 1L;
91+
root1.firstLevelReference = firstLevel1;
92+
session.persist( root1 );
93+
FirstLevelReferencedEntity firstLevel2 = new FirstLevelReferencedEntity();
94+
firstLevel2.id = 2L;
95+
firstLevel2.secondLevelReferenceA = secondLevelA;
96+
session.persist( firstLevel2 );
97+
RootEntity root2 = new RootEntity();
98+
root2.id = 2L;
99+
root2.firstLevelReference = firstLevel2;
100+
session.persist( root2 );
101+
} );
102+
}
103+
104+
@AfterAll
105+
public void tearDown(SessionFactoryScope scope) {
106+
scope.getSessionFactory().getSchemaManager().truncateMappedObjects();
107+
}
108+
109+
@Entity(name = "RootEntity")
110+
public static class RootEntity {
111+
@Id
112+
private Long id;
113+
114+
@ManyToOne
115+
private FirstLevelReferencedEntity firstLevelReference;
116+
}
117+
118+
@Entity(name = "FirstLevelReferencedEntity")
119+
public static class FirstLevelReferencedEntity {
120+
@Id
121+
private Long id;
122+
@ManyToOne
123+
private SecondLevelReferencedEntityA secondLevelReferenceA;
124+
@ManyToOne
125+
private SecondLevelReferencedEntityB secondLevelReferenceB;
126+
127+
}
128+
129+
@Entity(name = "SecondLevelReferencedEntityA")
130+
public static class SecondLevelReferencedEntityA {
131+
@Id
132+
private Long id;
133+
private String name;
134+
}
135+
136+
@Entity(name = "SecondLevelReferencedEntityB")
137+
public static class SecondLevelReferencedEntityB {
138+
@Id
139+
private Long id;
140+
}
141+
}

0 commit comments

Comments
 (0)