Skip to content

Commit ba1fbee

Browse files
committed
HHH-19868 Add test for issue
1 parent f4507a4 commit ba1fbee

File tree

1 file changed

+175
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)