44 */
55package org .hibernate .orm .test .query .criteria .internal .expression ;
66
7- import java .util .List ;
87import jakarta .persistence .Column ;
98import jakarta .persistence .Entity ;
109import jakarta .persistence .EnumType ;
1514import jakarta .persistence .criteria .Expression ;
1615import jakarta .persistence .criteria .Path ;
1716import jakarta .persistence .criteria .Root ;
18-
19-
17+ import org .hibernate .testing .orm .junit .DomainModel ;
2018import org .hibernate .testing .orm .junit .JiraKey ;
21- import org .hibernate .testing .junit4 .BaseCoreFunctionalTestCase ;
22- import org .junit .Assert ;
23- import org .junit .Test ;
19+ import org .hibernate .testing .orm .junit .SessionFactory ;
20+ import org .hibernate .testing .orm .junit .SessionFactoryScope ;
21+ import org .junit .jupiter .api .AfterEach ;
22+ import org .junit .jupiter .api .Test ;
2423
25- import static org .hibernate .testing .transaction .TransactionUtil .doInHibernate ;
26- import static org .junit .Assert .assertEquals ;
24+ import java .util .List ;
25+
26+ import static org .assertj .core .api .Assertions .assertThat ;
2727
2828/**
2929 *
3030 * @author Vasyl Danyliuk
3131 */
32- public class SearchedCaseExpressionTest extends BaseCoreFunctionalTestCase {
32+ @ DomainModel (
33+ annotatedClasses = {
34+ SearchedCaseExpressionTest .Event .class ,
35+ SearchedCaseExpressionTest .EventType .class
36+ }
37+ )
38+ @ SessionFactory
39+ public class SearchedCaseExpressionTest {
40+
41+ @ AfterEach
42+ public void tearDown (SessionFactoryScope scope ) {
43+ scope .getSessionFactory ().getSchemaManager ().truncateMappedObjects ();
44+ }
3345
3446 @ Test
35- public void testCaseClause () {
36- doInHibernate ( this :: sessionFactory , session -> {
47+ public void testCaseClause (SessionFactoryScope scope ) {
48+ scope . inTransaction ( session -> {
3749 CriteriaBuilder cb = session .getCriteriaBuilder ();
3850
39- CriteriaQuery <Event > criteria = cb .createQuery (Event .class );
51+ CriteriaQuery <Event > criteria = cb .createQuery ( Event .class );
4052
41- Root <Event > event = criteria .from (Event .class );
42- Path <EventType > type = event .get ("type" );
53+ Root <Event > event = criteria .from ( Event .class );
54+ Path <EventType > type = event .get ( "type" );
4355
44- Expression <String > caseWhen = cb .<EventType , String >selectCase (type )
45- .when (EventType .TYPE1 , "Admin Event" )
46- .when (EventType .TYPE2 , "User Event" )
47- .when (EventType .TYPE3 , "Reporter Event" )
48- .otherwise ("" );
56+ Expression <String > caseWhen = cb .<EventType , String >selectCase ( type )
57+ .when ( EventType .TYPE1 , "Admin Event" )
58+ .when ( EventType .TYPE2 , "User Event" )
59+ .when ( EventType .TYPE3 , "Reporter Event" )
60+ .otherwise ( "" );
4961
50- criteria .select (event );
51- criteria .where (cb .equal (caseWhen , "Admin Event" ) ); // OK when use cb.like() method and others
52- List <Event > resultList = session .createQuery (criteria ).getResultList ();
62+ criteria .select ( event );
63+ criteria .where ( cb .equal ( caseWhen , "Admin Event" ) ); // OK when use cb.like() method and others
64+ List <Event > resultList = session .createQuery ( criteria ).getResultList ();
5365
54- Assert . assertNotNull ( resultList );
66+ assertThat ( resultList ). isNotNull ( );
5567 } );
5668 }
5769
5870 @ Test
59- public void testEqualClause () {
60- doInHibernate ( this :: sessionFactory , session -> {
71+ public void testEqualClause (SessionFactoryScope scope ) {
72+ scope . inTransaction ( session -> {
6173 CriteriaBuilder cb = session .getCriteriaBuilder ();
6274
63- CriteriaQuery <Event > criteria = cb .createQuery (Event .class );
75+ CriteriaQuery <Event > criteria = cb .createQuery ( Event .class );
6476
65- Root <Event > event = criteria .from (Event .class );
66- Path <EventType > type = event .get ("type" );
77+ Root <Event > event = criteria .from ( Event .class );
78+ Path <EventType > type = event .get ( "type" );
6779
6880 Expression <String > caseWhen = cb .<String >selectCase ()
69- .when (cb .equal (type , EventType .TYPE1 ), "Type1" )
70- .otherwise ("" );
71-
72- criteria .select (event );
73- criteria .where (cb .equal (caseWhen , "Admin Event" )); // OK when use cb.like() method and others
74- List <Event > resultList = session .createQuery (criteria ).getResultList ();
81+ .when ( cb .equal ( type , EventType .TYPE1 ), "Type1" )
82+ .otherwise ( "" );
7583
84+ criteria .select ( event );
85+ criteria .where ( cb .equal ( caseWhen , "Admin Event" ) ); // OK when use cb.like() method and others
86+ List <Event > resultList = session .createQuery ( criteria ).getResultList ();
7687
77- Assert . assertNotNull ( resultList );
88+ assertThat ( resultList ). isNotNull ( );
7889 } );
7990 }
8091
8192 @ Test
8293 @ JiraKey (value = "HHH-13167" )
83- public void testMissingElseClause () {
84- doInHibernate ( this :: sessionFactory , session -> {
94+ public void testMissingElseClause (SessionFactoryScope scope ) {
95+ scope . inTransaction ( session -> {
8596 Event event = new Event ();
8697 event .id = 1L ;
8798 event .type = EventType .TYPE1 ;
8899
89100 session .persist ( event );
90101 } );
91102
92- doInHibernate ( this :: sessionFactory , session -> {
103+ scope . inTransaction ( session -> {
93104 CriteriaBuilder cb = session .getCriteriaBuilder ();
94105
95106 CriteriaQuery <Event > criteria = cb .createQuery ( Event .class );
96107
97108 Root <Event > root = criteria .from ( Event .class );
98109 Path <EventType > type = root .get ( "type" );
99110
100- Expression <String > caseWhen = cb .<String > selectCase ()
111+ Expression <String > caseWhen = cb .<String >selectCase ()
101112 .when ( cb .equal ( type , EventType .TYPE1 ), "Matched" );
102113
103114 criteria .select ( root );
104115 criteria .where ( cb .equal ( caseWhen , "Matched" ) );
105116
106117 Event event = session .createQuery ( criteria ).getSingleResult ();
107- assertEquals ( 1L , ( long ) event .id );
118+ assertThat ( event .id ). isEqualTo ( 1L );
108119 } );
109120 }
110121
111- @ Override
112- protected boolean isCleanupTestDataRequired () {
113- return true ;
114- }
115122
116- @ Override
117- protected Class [] getAnnotatedClasses () {
118- return new Class []{ Event .class , EventType .class };
123+ @ Test
124+ @ JiraKey ( "HHH-19896" )
125+ public void testCaseWhenWithOtherwiseClauseExecutedAfterOneWithout (SessionFactoryScope scope ) {
126+ scope .inTransaction ( session -> {
127+ Event event = new Event ();
128+ event .id = 1L ;
129+ event .type = EventType .TYPE1 ;
130+
131+ session .persist ( event );
132+ } );
133+
134+ scope .inTransaction ( session -> {
135+ CriteriaBuilder cb = session .getCriteriaBuilder ();
136+
137+ CriteriaQuery <Event > criteria = cb .createQuery ( Event .class );
138+
139+ Root <Event > root = criteria .from ( Event .class );
140+ Path <EventType > type = root .get ( "type" );
141+
142+ Expression <String > caseWhen = cb .<String >selectCase ()
143+ .when ( cb .equal ( type , EventType .TYPE1 ), "Matched" );
144+
145+ criteria .select ( root );
146+ criteria .where ( cb .equal ( caseWhen , "Matched" ) );
147+
148+ Event event = session .createQuery ( criteria ).getSingleResult ();
149+ assertThat ( event .id ).isEqualTo ( 1L );
150+ } );
151+
152+ scope .inTransaction ( session -> {
153+ CriteriaBuilder cb = session .getCriteriaBuilder ();
154+
155+ CriteriaQuery <Event > criteria = cb .createQuery ( Event .class );
156+
157+ Root <Event > event = criteria .from ( Event .class );
158+ Path <EventType > type = event .get ( "type" );
159+
160+ Expression <String > caseWhen = cb .<String >selectCase ()
161+ .when ( cb .equal ( type , EventType .TYPE1 ), "Type1" )
162+ .otherwise ( "" );
163+
164+ criteria .select ( event );
165+ criteria .where ( cb .equal ( caseWhen , "Admin Event" ) ); // OK when use cb.like() method and others
166+ List <Event > resultList = session .createQuery ( criteria ).getResultList ();
167+
168+ assertThat ( resultList ).isNotNull ();
169+ assertThat ( resultList ).hasSize ( 0 );
170+ } );
119171 }
120172
121173 @ Entity (name = "Event" )
@@ -142,8 +194,6 @@ public Event type(EventType type) {
142194 }
143195
144196 public enum EventType {
145-
146197 TYPE1 , TYPE2 , TYPE3
147-
148198 }
149199}
0 commit comments