Skip to content

Commit 4cb968e

Browse files
committed
HHH-16512 test for broken query on OneToOne relation
1 parent 3e36bc4 commit 4cb968e

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
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.jpa.criteria.query.one_to_one;
6+
7+
import java.util.List;
8+
9+
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;
10+
11+
import org.hibernate.testing.orm.junit.JiraKey;
12+
import org.hibernate.testing.transaction.TransactionUtil;
13+
import org.junit.Before;
14+
import org.junit.Test;
15+
16+
import jakarta.persistence.Entity;
17+
import jakarta.persistence.EntityManager;
18+
import jakarta.persistence.GeneratedValue;
19+
import jakarta.persistence.Id;
20+
import jakarta.persistence.JoinColumn;
21+
import jakarta.persistence.OneToOne;
22+
import jakarta.persistence.criteria.CriteriaBuilder;
23+
import jakarta.persistence.criteria.CriteriaQuery;
24+
import jakarta.persistence.criteria.Join;
25+
import jakarta.persistence.criteria.JoinType;
26+
import jakarta.persistence.criteria.Predicate;
27+
import jakarta.persistence.criteria.Root;
28+
29+
import static org.junit.Assert.assertEquals;
30+
31+
32+
public class CriteriaOneToOneTest extends BaseEntityManagerFunctionalTestCase {
33+
34+
@Before
35+
public void persist() {
36+
TransactionUtil.doInJPA( this::entityManagerFactory, (EntityManager session) -> {
37+
38+
User user1 = new User( "user1" );
39+
User user2 = new User( "user2" );
40+
41+
Customer customer1 = new Customer( "customer1" );
42+
Customer customer2 = new Customer( "customer2" );
43+
44+
user2.setCustomer( customer2 );
45+
customer2.setUser( user2 );
46+
47+
session.persist( customer1 );
48+
session.persist( customer2 );
49+
session.persist( user1 );
50+
session.persist( user2 );
51+
});
52+
}
53+
54+
@Test
55+
@JiraKey("HHH-16512")
56+
public void testCustomerWithoutUser() {
57+
58+
59+
TransactionUtil.doInJPA( this::entityManagerFactory, (EntityManager session) -> {
60+
61+
final CriteriaBuilder cb = session.getCriteriaBuilder();
62+
63+
//isNull predicate with direction Customer -> User
64+
final CriteriaQuery<Customer> customerUserIsNullQuery = cb.createQuery( Customer.class );
65+
final Root<Customer> customerUserIsNullRoot = customerUserIsNullQuery.from( Customer.class );
66+
customerUserIsNullQuery.where( cb.isNull( customerUserIsNullRoot.get( "user" ) ) );
67+
List<Customer> customerUserIsNullResults = session.createQuery( customerUserIsNullQuery )
68+
.getResultList();
69+
assertEquals( 1, customerUserIsNullResults.size() );
70+
71+
//isNull predicate on ID of Customer via Join with direction User -> Customer
72+
final CriteriaQuery<User> userJoinCustomerQuery = cb.createQuery( User.class );
73+
Root<User> userJoinCustomerQueryRoot = userJoinCustomerQuery.from( User.class );
74+
final Join<User, Customer> customerJoin = userJoinCustomerQueryRoot.join( "customer", JoinType.LEFT );
75+
final Predicate isCustomerIDNullPredicate = cb.isNull( customerJoin.get( "id" ) );
76+
userJoinCustomerQuery.where( isCustomerIDNullPredicate );
77+
List<User> userJoinCustomerResults = session.createQuery( userJoinCustomerQuery ).getResultList();
78+
assertEquals( 1, userJoinCustomerResults.size() );
79+
80+
//isNull predicate on Customer via Join with direction User -> Customer (should do the same as the one above)
81+
final CriteriaQuery<User> userCustomerIsNullQuery = cb.createQuery( User.class );
82+
final Root<User> userCustomerIsNullRoot = userCustomerIsNullQuery.from( User.class );
83+
userCustomerIsNullQuery.where( cb.isNull( userCustomerIsNullRoot.get( "customer" ) ) );
84+
List<User> userCustomerIsNullResults = session.createQuery( userCustomerIsNullQuery )
85+
.getResultList();
86+
assertEquals( 1, userCustomerIsNullResults.size() );
87+
});
88+
}
89+
90+
@Override
91+
protected Class<?>[] getAnnotatedClasses() {
92+
return new Class[]{ User.class, Customer.class };
93+
}
94+
95+
/**
96+
* @author Janario Oliveira
97+
*/
98+
@Entity
99+
public static class Customer {
100+
@Id
101+
@GeneratedValue
102+
private Integer id;
103+
private String name;
104+
105+
@OneToOne
106+
@JoinColumn(name = "user_id")
107+
private User user;
108+
109+
protected Customer() {
110+
}
111+
112+
public Customer(String name) {
113+
this.name = name;
114+
}
115+
116+
public User getUser() {
117+
return user;
118+
}
119+
120+
public void setUser(User user) {
121+
this.user = user;
122+
}
123+
124+
@Override
125+
public boolean equals(Object o) {
126+
if ( !( o instanceof Customer ) ) {
127+
return false;
128+
}
129+
130+
Customer seller = (Customer) o;
131+
return name.equals( seller.name );
132+
}
133+
134+
@Override
135+
public int hashCode() {
136+
return name.hashCode();
137+
}
138+
}
139+
140+
/**
141+
* @author Janario Oliveira
142+
*/
143+
@Entity
144+
public static class User {
145+
@Id
146+
@GeneratedValue
147+
private Integer id;
148+
private String name;
149+
150+
@OneToOne(mappedBy = "user")
151+
private Customer customer;
152+
153+
protected User() {
154+
}
155+
156+
public User(String name) {
157+
this.name = name;
158+
}
159+
160+
public Customer getCustomer() {
161+
return customer;
162+
}
163+
164+
public void setCustomer(Customer customer) {
165+
this.customer = customer;
166+
}
167+
168+
@Override
169+
public boolean equals(Object o) {
170+
if ( !( o instanceof User ) ) {
171+
return false;
172+
}
173+
174+
User customer = (User) o;
175+
return name.equals( customer.name );
176+
177+
}
178+
179+
@Override
180+
public int hashCode() {
181+
return name.hashCode();
182+
}
183+
}
184+
}

0 commit comments

Comments
 (0)