Skip to content

Commit f0c7c99

Browse files
committed
HHH-16719 Add test for issue
1 parent e4dae1b commit f0c7c99

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.query.criteria;
8+
9+
import org.hibernate.testing.orm.junit.DomainModel;
10+
import org.hibernate.testing.orm.junit.Jira;
11+
import org.hibernate.testing.orm.junit.SessionFactory;
12+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
13+
import org.junit.jupiter.api.AfterAll;
14+
import org.junit.jupiter.api.BeforeAll;
15+
import org.junit.jupiter.api.Test;
16+
17+
import jakarta.persistence.DiscriminatorColumn;
18+
import jakarta.persistence.DiscriminatorValue;
19+
import jakarta.persistence.Entity;
20+
import jakarta.persistence.GeneratedValue;
21+
import jakarta.persistence.Id;
22+
import jakarta.persistence.Inheritance;
23+
import jakarta.persistence.OneToOne;
24+
import jakarta.persistence.criteria.CriteriaBuilder;
25+
import jakarta.persistence.criteria.CriteriaQuery;
26+
import jakarta.persistence.criteria.Join;
27+
import jakarta.persistence.criteria.Root;
28+
29+
import static jakarta.persistence.DiscriminatorType.STRING;
30+
import static jakarta.persistence.InheritanceType.SINGLE_TABLE;
31+
import static org.assertj.core.api.Assertions.assertThat;
32+
33+
/**
34+
* @author Marco Belladelli
35+
*/
36+
@SessionFactory
37+
@DomainModel( annotatedClasses = {
38+
CriteriaInheritanceJoinTest.Address.class,
39+
CriteriaInheritanceJoinTest.StreetAddress.class,
40+
CriteriaInheritanceJoinTest.Street.class,
41+
} )
42+
@Jira( "https://hibernate.atlassian.net/browse/HHH-16719" )
43+
public class CriteriaInheritanceJoinTest {
44+
@BeforeAll
45+
public void setUp(SessionFactoryScope scope) {
46+
scope.inTransaction( session -> {
47+
final Street street = new Street( "Via Roma" );
48+
session.persist( street );
49+
final StreetAddress streetAddress = new StreetAddress( 1, "A", street );
50+
session.persist( streetAddress );
51+
} );
52+
}
53+
54+
@AfterAll
55+
public void tearDown(SessionFactoryScope scope) {
56+
scope.inTransaction( session -> {
57+
session.createMutationQuery( "delete from StreetAddress" ).executeUpdate();
58+
session.createMutationQuery( "delete from Street" ).executeUpdate();
59+
} );
60+
}
61+
62+
@Test
63+
public void findStreet(SessionFactoryScope scope) {
64+
scope.inTransaction( session -> {
65+
final CriteriaBuilder cb = session.getCriteriaBuilder();
66+
final CriteriaQuery<Street> streetCriteriaQuery = cb.createQuery( Street.class );
67+
final Root<Street> streetRoot = streetCriteriaQuery.from( Street.class );
68+
streetCriteriaQuery.select( streetRoot ).where( cb.equal( streetRoot.get( "name" ), "Via Roma" ) );
69+
final Street result = session.createQuery( streetCriteriaQuery ).getSingleResult();
70+
assertThat( result.getName() ).isEqualTo( "Via Roma" );
71+
} );
72+
}
73+
74+
@Test
75+
public void findAddressImplicitJoin(SessionFactoryScope scope) {
76+
scope.inTransaction( session -> {
77+
final CriteriaBuilder cb = session.getCriteriaBuilder();
78+
final CriteriaQuery<Address> cq = cb.createQuery( Address.class );
79+
final Root<Address> addressRoot = cq.from( Address.class );
80+
cq.select( addressRoot ).where(
81+
cb.equal( cb.treat( addressRoot, StreetAddress.class )
82+
.get( "street" )
83+
.get( "name" ), "Via Roma" )
84+
);
85+
final Address result = session.createQuery( cq ).getSingleResult();
86+
assertThat( result ).isInstanceOf( StreetAddress.class );
87+
assertThat( ( (StreetAddress) result ).getStreet().getName() ).isEqualTo( "Via Roma" );
88+
} );
89+
}
90+
91+
@Test
92+
public void findAddressExplicitJoin(SessionFactoryScope scope) {
93+
scope.inTransaction( session -> {
94+
final CriteriaBuilder cb = session.getCriteriaBuilder();
95+
final CriteriaQuery<Address> cq = cb.createQuery( Address.class );
96+
final Root<Address> addressRoot = cq.from( Address.class );
97+
final Join<Address, Street> join = addressRoot.join( "street" );
98+
cq.select( addressRoot ).where( cb.equal( join.get( "name" ), "Via Roma" ) );
99+
final Address result = session.createQuery( cq ).getSingleResult();
100+
assertThat( result ).isInstanceOf( StreetAddress.class );
101+
assertThat( ( (StreetAddress) result ).getStreet().getName() ).isEqualTo( "Via Roma" );
102+
} );
103+
}
104+
105+
@Entity( name = "Address" )
106+
@Inheritance( strategy = SINGLE_TABLE )
107+
@DiscriminatorColumn( name = "disc_col", discriminatorType = STRING )
108+
public static class Address {
109+
@Id
110+
@GeneratedValue
111+
private Long id;
112+
}
113+
114+
@Entity( name = "StreetAddress" )
115+
@DiscriminatorValue( "O" )
116+
public static class StreetAddress extends Address {
117+
private Integer houseNumber;
118+
private String houseLetter;
119+
@OneToOne
120+
private Street street;
121+
122+
public StreetAddress() {
123+
}
124+
125+
public StreetAddress(Integer houseNumber, String houseLetter, Street street) {
126+
this.houseNumber = houseNumber;
127+
this.houseLetter = houseLetter;
128+
this.street = street;
129+
}
130+
131+
public Integer getHouseNumber() {
132+
return houseNumber;
133+
}
134+
135+
public String getHouseLetter() {
136+
return houseLetter;
137+
}
138+
139+
public Street getStreet() {
140+
return street;
141+
}
142+
}
143+
144+
@Entity( name = "Street" )
145+
public static class Street {
146+
@Id
147+
@GeneratedValue
148+
private Long id;
149+
private String name;
150+
151+
public Street() {
152+
}
153+
154+
public Street(String name) {
155+
this.name = name;
156+
}
157+
158+
public String getName() {
159+
return name;
160+
}
161+
}
162+
}

0 commit comments

Comments
 (0)