Skip to content

Commit d29b842

Browse files
committed
HHH-18864 - Creating NativeQuery with result-class leads to problems with addEntity and addRoot
1 parent 707c3a7 commit d29b842

File tree

3 files changed

+163
-1
lines changed

3 files changed

+163
-1
lines changed

hibernate-core/src/test/java/org/hibernate/orm/test/sql/hand/Speech.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,46 @@
55
package org.hibernate.orm.test.sql.hand;
66

77

8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.Id;
11+
812
/**
913
* @author Emmanuel Bernard
1014
*/
11-
public class Speech {
15+
@Entity
16+
public class Speech implements SpeechInterface {
17+
@Id @GeneratedValue
1218
private Integer id;
1319
private String name;
1420
private Double length;
1521

22+
@Override
1623
public Integer getId() {
1724
return id;
1825
}
1926

27+
@Override
2028
public void setId(Integer id) {
2129
this.id = id;
2230
}
2331

32+
@Override
2433
public Double getLength() {
2534
return length;
2635
}
2736

37+
@Override
2838
public void setLength(Double length) {
2939
this.length = length;
3040
}
3141

42+
@Override
3243
public String getName() {
3344
return name;
3445
}
3546

47+
@Override
3648
public void setName(String name) {
3749
this.name = name;
3850
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.sql.hand;
6+
7+
/**
8+
* @author Steve Ebersole
9+
*/
10+
public interface SpeechInterface {
11+
Integer getId();
12+
void setId(Integer id);
13+
14+
Double getLength();
15+
void setLength(Double length);
16+
17+
String getName();
18+
void setName(String name);
19+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.sql.hand.query;
6+
7+
import org.hibernate.orm.test.sql.hand.Speech;
8+
import org.hibernate.orm.test.sql.hand.SpeechInterface;
9+
import org.hibernate.query.NativeQuery;
10+
import org.hibernate.testing.orm.junit.DomainModel;
11+
import org.hibernate.testing.orm.junit.Jira;
12+
import org.hibernate.testing.orm.junit.JiraKey;
13+
import org.hibernate.testing.orm.junit.NotImplementedYet;
14+
import org.hibernate.testing.orm.junit.SessionFactory;
15+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
16+
import org.junit.jupiter.api.AfterEach;
17+
import org.junit.jupiter.api.BeforeEach;
18+
import org.junit.jupiter.api.Test;
19+
20+
import java.util.List;
21+
22+
import static org.junit.jupiter.api.Assertions.assertEquals;
23+
24+
/**
25+
* @author Steve Ebersole
26+
*/
27+
@SuppressWarnings("JUnitMalformedDeclaration")
28+
@DomainModel(annotatedClasses = {SpeechInterface.class, Speech.class})
29+
@SessionFactory
30+
@Jira("https://hibernate.atlassian.net/browse/HHH-18864")
31+
public class EntityReturnClassTests {
32+
33+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34+
// no return-class -> no problem
35+
36+
@Test
37+
@JiraKey("HHH-18864")
38+
public void testAddEntityNoReturn(SessionFactoryScope scope) {
39+
scope.inTransaction( (session) -> {
40+
//noinspection unchecked,deprecation
41+
NativeQuery<Speech> query = session.createNativeQuery( "select {s.*} from Speech s" );
42+
query.addEntity("s", Speech.class);
43+
List<Speech> l = query.list();
44+
assertEquals( l.size(), 1 );
45+
} );
46+
}
47+
48+
@Test
49+
@JiraKey("HHH-18864")
50+
public void testAddRootNoReturn(SessionFactoryScope scope) {
51+
scope.inTransaction( (session) -> {
52+
//noinspection unchecked,deprecation
53+
NativeQuery<Speech> query = session.createNativeQuery( "select {s.*} from Speech s" );
54+
query.addRoot("s", Speech.class);
55+
List<Speech> l = query.list();
56+
assertEquals( l.size(), 1 );
57+
} );
58+
}
59+
60+
61+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
62+
// entity return-class -> problems with 2 `ResultBuilder` refs
63+
64+
@Test
65+
@JiraKey("HHH-18864")
66+
@NotImplementedYet
67+
public void testAddEntityWithEntityReturn(SessionFactoryScope scope) {
68+
scope.inTransaction( (session) -> {
69+
NativeQuery<Speech> query = session.createNativeQuery( "select {s.*} from Speech s", Speech.class );
70+
query.addEntity("s", Speech.class);
71+
List<Speech> l = query.list();
72+
assertEquals( l.size(), 1 );
73+
} );
74+
}
75+
76+
@Test
77+
@JiraKey("HHH-18864")
78+
@NotImplementedYet
79+
public void testAddRootWithEntityReturn(SessionFactoryScope scope) {
80+
scope.inTransaction( (session) -> {
81+
NativeQuery<Speech> query = session.createNativeQuery( "select {s.*} from Speech s", Speech.class );
82+
query.addRoot("s", Speech.class);
83+
List<Speech> l = query.list();
84+
assertEquals( l.size(), 1 );
85+
} );
86+
}
87+
88+
89+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
90+
// entity-interface return-class -> problems with `JdbcType` determination
91+
92+
@Test
93+
@JiraKey("HHH-18864")
94+
@NotImplementedYet
95+
public void testAddEntityWithInterfaceReturn(SessionFactoryScope scope) {
96+
scope.inTransaction( (session) -> {
97+
NativeQuery<SpeechInterface> query = session.createNativeQuery( "select {s.*} from Speech s", SpeechInterface.class );
98+
query.addEntity("s", Speech.class);
99+
List<SpeechInterface> l = query.list();
100+
assertEquals( l.size(), 1 );
101+
} );
102+
}
103+
104+
@Test
105+
@JiraKey("HHH-18864")
106+
@NotImplementedYet
107+
public void testAddRootWithInterfaceReturn(SessionFactoryScope scope) {
108+
scope.inTransaction( (session) -> {
109+
NativeQuery<SpeechInterface> query = session.createNativeQuery( "select {s.*} from Speech s", SpeechInterface.class );
110+
query.addRoot("s", Speech.class);
111+
List<SpeechInterface> l = query.list();
112+
assertEquals( l.size(), 1 );
113+
} );
114+
}
115+
116+
117+
@BeforeEach
118+
void prepareTestData(SessionFactoryScope scope) {
119+
scope.inTransaction( (session) -> {
120+
Speech speech = new Speech();
121+
speech.setLength( 23d );
122+
speech.setName( "Mine" );
123+
session.persist( speech );
124+
} );
125+
}
126+
127+
@AfterEach
128+
void dropTestData(SessionFactoryScope scope) {
129+
scope.inTransaction( (session) -> session.createMutationQuery( "delete Speech" ).executeUpdate() );
130+
}
131+
}

0 commit comments

Comments
 (0)