Skip to content

Commit cc31309

Browse files
ettavoltdreab8
authored andcommitted
HHH-15142 Add test for issue
1 parent 3094185 commit cc31309

File tree

2 files changed

+248
-15
lines changed

2 files changed

+248
-15
lines changed

hibernate-core/src/test/java/org/hibernate/jpa/test/query/CriteriaUpdateWithParametersTest.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package org.hibernate.jpa.test.query;
22

3-
import org.hibernate.testing.TestForIssue;
4-
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
5-
import org.hibernate.testing.orm.junit.Jpa;
6-
import org.junit.jupiter.api.Test;
7-
83
import javax.persistence.Entity;
94
import javax.persistence.Id;
105
import javax.persistence.Query;
@@ -14,15 +9,27 @@
149
import javax.persistence.criteria.Root;
1510
import javax.persistence.metamodel.EntityType;
1611

17-
@Jpa(
18-
annotatedClasses = CriteriaUpdateWithParametersTest.Person.class
19-
)
20-
@TestForIssue( jiraKey = "HHH-15113")
21-
public class CriteriaUpdateWithParametersTest {
12+
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
13+
14+
import org.hibernate.testing.TestForIssue;
15+
import org.junit.Test;
16+
17+
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
18+
19+
@TestForIssue(jiraKey = "HHH-15113")
20+
public class CriteriaUpdateWithParametersTest extends BaseEntityManagerFunctionalTestCase {
21+
22+
@Override
23+
protected Class<?>[] getAnnotatedClasses() {
24+
return new Class[] {
25+
Person.class
26+
};
27+
}
2228

2329
@Test
24-
public void testCriteriaUpdate(EntityManagerFactoryScope scope) {
25-
scope.inTransaction(
30+
public void testCriteriaUpdate() {
31+
doInJPA(
32+
this::entityManagerFactory,
2633
entityManager -> {
2734
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
2835
final CriteriaUpdate<Person> criteriaUpdate = criteriaBuilder.createCriteriaUpdate( Person.class );
@@ -33,7 +40,10 @@ public void testCriteriaUpdate(EntityManagerFactoryScope scope) {
3340

3441
final EntityType<Person> personEntityType = entityManager.getMetamodel().entity( Person.class );
3542

36-
criteriaUpdate.set( root.get( personEntityType.getSingularAttribute( "age", Integer.class ) ), intValueParameter );
43+
criteriaUpdate.set(
44+
root.get( personEntityType.getSingularAttribute( "age", Integer.class ) ),
45+
intValueParameter
46+
);
3747

3848
criteriaUpdate.where( criteriaBuilder.equal(
3949
root.get( personEntityType.getSingularAttribute( "name", String.class ) ),
@@ -50,8 +60,9 @@ public void testCriteriaUpdate(EntityManagerFactoryScope scope) {
5060
}
5161

5262
@Test
53-
public void testCriteriaUpdate2(EntityManagerFactoryScope scope) {
54-
scope.inTransaction(
63+
public void testCriteriaUpdate2() {
64+
doInJPA(
65+
this::entityManagerFactory,
5566
entityManager -> {
5667
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
5768
final CriteriaUpdate<Person> criteriaUpdate = criteriaBuilder.createCriteriaUpdate( Person.class );
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
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.jpa.test.query;
8+
9+
import java.time.Instant;
10+
import java.util.Date;
11+
import java.util.List;
12+
import javax.persistence.Entity;
13+
import javax.persistence.GeneratedValue;
14+
import javax.persistence.Id;
15+
import javax.persistence.Query;
16+
import javax.persistence.TypedQuery;
17+
import javax.persistence.criteria.CriteriaBuilder;
18+
import javax.persistence.criteria.CriteriaQuery;
19+
import javax.persistence.criteria.ParameterExpression;
20+
import javax.persistence.criteria.Root;
21+
22+
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
23+
import org.hibernate.jpa.test.Wallet;
24+
import org.hibernate.jpa.test.Wallet_;
25+
26+
import org.hibernate.testing.TestForIssue;
27+
import org.junit.After;
28+
import org.junit.Test;
29+
30+
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
31+
import static org.junit.Assert.assertEquals;
32+
33+
@TestForIssue(jiraKey = "HHH-15142")
34+
public class ReuseCriteriaWithMixedParametersTest extends BaseEntityManagerFunctionalTestCase {
35+
36+
@Override
37+
protected Class<?>[] getAnnotatedClasses() {
38+
return new Class[] {
39+
Wallet.class,
40+
Person.class
41+
};
42+
}
43+
44+
@After
45+
public void tearDown() {
46+
doInJPA( this::entityManagerFactory, entityManager -> {
47+
entityManager.createQuery( "delete from Person" ).executeUpdate();
48+
}
49+
);
50+
}
51+
52+
@Test
53+
public void cqReuse() {
54+
doInJPA( this::entityManagerFactory, entityManager -> {
55+
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
56+
final CriteriaQuery<Wallet> criteriaQuery = criteriaBuilder.createQuery( Wallet.class );
57+
final Root<Wallet> root = criteriaQuery.from( Wallet.class );
58+
59+
final ParameterExpression<String> stringValueParameter = criteriaBuilder.parameter( String.class );
60+
61+
criteriaQuery.where(
62+
criteriaBuilder.like(
63+
root.get( Wallet_.model ),
64+
stringValueParameter
65+
),
66+
criteriaBuilder.lessThan(
67+
root.get( Wallet_.marketEntrance ),
68+
criteriaBuilder.literal( Date.from( Instant.EPOCH ) )
69+
)
70+
);
71+
72+
Query query = entityManager.createQuery( criteriaQuery );
73+
query.setParameter( stringValueParameter, "Z%" );
74+
75+
query.getResultList();
76+
77+
query = entityManager.createQuery( criteriaQuery );
78+
query.setParameter( stringValueParameter, "A%" );
79+
80+
query.getResultList();
81+
82+
} );
83+
}
84+
85+
@Test
86+
public void likeCqReuse() {
87+
doInJPA( this::entityManagerFactory, entityManager -> {
88+
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
89+
final CriteriaQuery<Wallet> criteriaQuery = criteriaBuilder.createQuery( Wallet.class );
90+
final Root<Wallet> root = criteriaQuery.from( Wallet.class );
91+
92+
final ParameterExpression<String> stringValueParameter = criteriaBuilder.parameter( String.class );
93+
94+
criteriaQuery.where(
95+
criteriaBuilder.like(
96+
root.get( Wallet_.model ),
97+
stringValueParameter,
98+
'/'
99+
)
100+
);
101+
102+
Query query = entityManager.createQuery( criteriaQuery );
103+
query.setParameter( stringValueParameter, "Z%" );
104+
105+
query.getResultList();
106+
107+
query = entityManager.createQuery( criteriaQuery );
108+
query.setParameter( stringValueParameter, "A%" );
109+
110+
query.getResultList();
111+
112+
} );
113+
}
114+
115+
@Test
116+
public void predicateReuse() {
117+
doInJPA( this::entityManagerFactory, entityManager -> {
118+
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
119+
final CriteriaQuery<Wallet> criteriaQuery = criteriaBuilder.createQuery( Wallet.class );
120+
final Root<Wallet> root = criteriaQuery.from( Wallet.class );
121+
122+
final ParameterExpression<String> stringValueParameter = criteriaBuilder.parameter( String.class );
123+
final ParameterExpression<Date> dateValueParameter = criteriaBuilder.parameter( Date.class );
124+
125+
criteriaQuery.where(
126+
criteriaBuilder.like(
127+
root.get( Wallet_.model ),
128+
stringValueParameter
129+
)
130+
);
131+
132+
Query query = entityManager.createQuery( criteriaQuery );
133+
query.setParameter( stringValueParameter, "Z%" );
134+
135+
query.getResultList();
136+
137+
criteriaQuery.where(
138+
criteriaBuilder.like(
139+
root.get( Wallet_.model ),
140+
stringValueParameter
141+
),
142+
criteriaBuilder.lessThan(
143+
root.get( Wallet_.marketEntrance ),
144+
dateValueParameter
145+
)
146+
);
147+
148+
query = entityManager.createQuery( criteriaQuery );
149+
query.setParameter( stringValueParameter, "A%" );
150+
query.setParameter( dateValueParameter, Date.from( Instant.EPOCH ) );
151+
152+
query.getResultList();
153+
} );
154+
}
155+
156+
@Test
157+
public void testLikePredicate() {
158+
doInJPA( this::entityManagerFactory, entityManager -> {
159+
160+
entityManager.persist( new Person( "Person 1" ) );
161+
entityManager.persist( new Person( "Person 2" ) );
162+
}
163+
);
164+
165+
doInJPA( this::entityManagerFactory, entityManager -> {
166+
final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
167+
final CriteriaQuery<Person> personQuery = cb.createQuery( Person.class );
168+
final Root<Person> root = personQuery.from( Person.class );
169+
final ParameterExpression<String> pattern = cb.parameter( String.class );
170+
CriteriaQuery<Person> criteriaQuery = personQuery
171+
.where( cb.like(
172+
root.get( "name" ),
173+
pattern,
174+
cb.literal( '\\' )
175+
) );
176+
for ( int i = 0; i < 2; i++ ) {
177+
178+
final TypedQuery<Person> query = entityManager.createQuery( criteriaQuery );
179+
query.setParameter( pattern, "%_1" );
180+
final List<Person> result = query.getResultList();
181+
182+
assertEquals( 1, result.size() );
183+
}
184+
}
185+
);
186+
187+
}
188+
189+
@Entity(name = "Person")
190+
public static class Person {
191+
@Id
192+
@GeneratedValue
193+
private Long id;
194+
195+
private String name;
196+
197+
public Person() {
198+
}
199+
200+
public Person(String name) {
201+
this.name = name;
202+
}
203+
204+
public Long getId() {
205+
return id;
206+
}
207+
208+
public void setId(Long id) {
209+
this.id = id;
210+
}
211+
212+
public String getName() {
213+
return name;
214+
}
215+
216+
public void setName(String name) {
217+
this.name = name;
218+
}
219+
}
220+
221+
222+
}

0 commit comments

Comments
 (0)