Skip to content

Commit cd86257

Browse files
committed
HHH-19874 Add test for issue
1 parent 3d1dc3b commit cd86257

File tree

1 file changed

+176
-0
lines changed

1 file changed

+176
-0
lines changed
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.query;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.OneToMany;
12+
import jakarta.persistence.Table;
13+
import jakarta.persistence.Transient;
14+
import jakarta.persistence.Version;
15+
import org.hibernate.Hibernate;
16+
import org.hibernate.annotations.Fetch;
17+
import org.hibernate.annotations.FetchMode;
18+
import org.hibernate.testing.orm.junit.DomainModel;
19+
import org.hibernate.testing.orm.junit.JiraKey;
20+
import org.hibernate.testing.orm.junit.SessionFactory;
21+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
22+
import org.junit.jupiter.api.AfterEach;
23+
import org.junit.jupiter.api.BeforeEach;
24+
import org.junit.jupiter.api.Test;
25+
26+
import java.util.ArrayList;
27+
import java.util.List;
28+
import java.util.Objects;
29+
30+
import static jakarta.persistence.CascadeType.PERSIST;
31+
import static jakarta.persistence.FetchType.EAGER;
32+
import static jakarta.persistence.FetchType.LAZY;
33+
import static org.assertj.core.api.Assertions.assertThat;
34+
import static org.hibernate.annotations.FetchMode.SUBSELECT;
35+
import static org.junit.jupiter.api.Assertions.assertTrue;
36+
37+
@DomainModel(
38+
annotatedClasses = {
39+
SubselectFetchTest.Element.class,
40+
SubselectFetchTest.Node.class,
41+
}
42+
)
43+
@SessionFactory
44+
public class SubselectFetchTest {
45+
46+
@BeforeEach
47+
public void setUp(SessionFactoryScope scope) {
48+
scope.inTransaction(
49+
session -> {
50+
Node basik = new Node( "Child" );
51+
basik.parent = new Node( "Parent" );
52+
basik.elements.add( new Element( basik ) );
53+
basik.elements.add( new Element( basik ) );
54+
basik.elements.add( new Element( basik ) );
55+
56+
session.persist( basik );
57+
}
58+
);
59+
}
60+
61+
@AfterEach
62+
@JiraKey("HHH-19868")
63+
public void tearDown(SessionFactoryScope scope) {
64+
scope.getSessionFactory().getSchemaManager().truncateMappedObjects();
65+
}
66+
67+
@Test
68+
void testEagerFetchQuery(SessionFactoryScope scope) {
69+
scope.inTransaction( session -> {
70+
List<Node> list = session.createSelectionQuery( "from Node order by id", Node.class ).getResultList();
71+
assertThat( list ).hasSize( 2 );
72+
assertThat( Hibernate.isInitialized( list.get( 0 ).elements ) ).isTrue();
73+
assertThat( list.get( 0 ).elements ).hasSize( 3 );
74+
assertThat( list.get( 1 ).elements ).isEmpty();
75+
} );
76+
77+
scope.inTransaction( session -> {
78+
List<Object[]> list = session.createSelectionQuery( "select distinct n, e from Node n join n.elements e order by n.id", Object[].class ).getResultList();
79+
assertThat( list ).hasSize( 3 );
80+
Object[] tup = list.get( 0 );
81+
assertTrue( Hibernate.isInitialized( ( (Node) tup[0] ).elements ) );
82+
assertThat( ( (Node) tup[0] ).elements ).hasSize( 3 );
83+
} );
84+
}
85+
86+
87+
@Entity(name = "Element")
88+
@Table(name = "Element")
89+
public static class Element {
90+
@Id
91+
@GeneratedValue
92+
Integer id;
93+
94+
@ManyToOne
95+
@Fetch(FetchMode.SELECT)
96+
Node node;
97+
98+
public Element(Node node) {
99+
this.node = node;
100+
}
101+
102+
public Element() {
103+
}
104+
}
105+
106+
@Entity(name = "Node")
107+
@Table(name = "Node")
108+
public static class Node {
109+
110+
@Id
111+
@GeneratedValue
112+
Integer id;
113+
@Version
114+
Integer version;
115+
String string;
116+
@Transient
117+
boolean loaded = false;
118+
119+
@ManyToOne(fetch = LAZY, cascade = PERSIST)
120+
Node parent;
121+
122+
@OneToMany(fetch = EAGER, cascade = PERSIST , mappedBy = "node")
123+
@Fetch(SUBSELECT)
124+
List<Element> elements = new ArrayList<>();
125+
126+
public Node(String string) {
127+
this.string = string;
128+
}
129+
130+
public Node() {
131+
}
132+
133+
public Integer getId() {
134+
return id;
135+
}
136+
137+
public void setId(Integer id) {
138+
this.id = id;
139+
}
140+
141+
public String getString() {
142+
return string;
143+
}
144+
145+
public void setString(String string) {
146+
this.string = string;
147+
}
148+
149+
// @PostLoad
150+
// void postLoad() {
151+
// loaded = true;
152+
// }
153+
154+
@Override
155+
public String toString() {
156+
return id + ": " + string;
157+
}
158+
159+
@Override
160+
public boolean equals(Object o) {
161+
if ( this == o ) {
162+
return true;
163+
}
164+
if ( o == null || getClass() != o.getClass() ) {
165+
return false;
166+
}
167+
Node node = (Node) o;
168+
return Objects.equals( string, node.string );
169+
}
170+
171+
@Override
172+
public int hashCode() {
173+
return Objects.hash( string );
174+
}
175+
}
176+
}

0 commit comments

Comments
 (0)