1414import  jakarta .persistence .criteria .JoinType ;
1515import  jakarta .persistence .criteria .ParameterExpression ;
1616import  jakarta .persistence .criteria .Root ;
17+ import  org .hibernate .engine .spi .SessionImplementor ;
18+ import  org .hibernate .query .spi .QueryImplementor ;
1719import  org .hibernate .testing .orm .junit .DomainModel ;
20+ import  org .hibernate .testing .orm .junit .Jira ;
1821import  org .hibernate .testing .orm .junit .SessionFactory ;
1922import  org .hibernate .testing .orm .junit .SessionFactoryScope ;
23+ import  org .junit .jupiter .api .AfterEach ;
2024import  org .junit .jupiter .api .Test ;
2125
2226import  java .util .List ;
2832public  class  CountTest  {
2933
3034	@ Test  void  testCount (SessionFactoryScope  scope ) {
31- 		scope .inTransaction (session  -> session .createMutationQuery ("delete Book" ).executeUpdate ());
3235		scope .inTransaction (session  -> {
3336			session .persist (new  Book ("9781932394153" , "Hibernate in Action" ));
3437			session .persist (new  Book ("9781617290459" , "Java Persistence with Hibernate" ));
@@ -64,7 +67,6 @@ public class CountTest {
6467	}
6568
6669	@ Test  void  testCountNative (SessionFactoryScope  scope ) {
67- 		scope .inTransaction (session  -> session .createMutationQuery ("delete Book" ).executeUpdate ());
6870		scope .inTransaction (session  -> {
6971			session .persist (new  Book ("9781932394153" , "Hibernate in Action" ));
7072			session .persist (new  Book ("9781617290459" , "Java Persistence with Hibernate" ));
@@ -86,7 +88,6 @@ public class CountTest {
8688	}
8789
8890	@ Test  void  testCountCriteria (SessionFactoryScope  scope ) {
89- 		scope .inTransaction (session  -> session .createMutationQuery ("delete Book" ).executeUpdate ());
9091		scope .inTransaction (session  -> {
9192			session .persist (new  Book ("9781932394153" , "Hibernate in Action" ));
9293			session .persist (new  Book ("9781617290459" , "Java Persistence with Hibernate" ));
@@ -120,6 +121,50 @@ public class CountTest {
120121		});
121122	}
122123
124+ 	@ Test 
125+ 	@ Jira ( "https://hibernate.atlassian.net/browse/HHH-19065"  )
126+ 	public  void  testJoins (SessionFactoryScope  scope ) {
127+ 		scope .inTransaction ( session  -> {
128+ 			Publisher  p  = new  Publisher ( 1L , "Manning"  );
129+ 			session .persist ( p  );
130+ 			final  Book  book  = new  Book ( "9781932394153" , "Hibernate in Action"  );
131+ 			book .publisher  = p ;
132+ 			session .persist ( book  );
133+ 			session .persist ( new  Book ( "9781617290459" , "Java Persistence with Hibernate"  ) );
134+ 		} );
135+ 		scope .inSession ( session  -> {
136+ 			// explicit inner join 
137+ 			assertCount ( 1 , "select p from Book b join b.publisher p" , Publisher .class , session  );
138+ 			assertCount ( 1 , "select p.name from Book b join b.publisher p" , String .class , session  );
139+ 			// explicit left join 
140+ 			assertCount ( 2 , "select p from Book b left join b.publisher p" , Publisher .class , session  );
141+ 			assertCount ( 2 , "select p.name from Book b left join b.publisher p" , String .class , session  );
142+ 			// implicit join 
143+ 			assertCount ( 1 , "select b.publisher from Book b" , Publisher .class , session  );
144+ 			assertCount ( 1 , "select b.publisher from Book b join b.publisher" , Publisher .class , session  );
145+ 			assertCount ( 1 , "select b.publisher.name from Book b" , String .class , session  );
146+ 			assertCount ( 1 , "select publisher.name from Book b left join b.publisher" , String .class , session  );
147+ 			assertCount ( 1 ,
148+ 					"select publisher.name from Book b left join b.publisher where publisher.name is null or length(publisher.name) > 0" ,
149+ 					String .class , session  );
150+ 			// selecting only the id does not create an explicit join 
151+ 			assertCount ( 2 , "select b.publisher.id from Book b" , Long .class , session  );
152+ 		} );
153+ 	}
154+ 
155+ 	private  <T > void  assertCount (int  expected , String  hql , Class <T > resultClass , SessionImplementor  session ) {
156+ 		final  QueryImplementor <T > query  = session .createQuery ( hql , resultClass  );
157+ 		final  List <T > resultList  = query .getResultList ();
158+ 		final  long  resultCount  = query .getResultCount ();
159+ 		assertEquals ( expected , resultList .size () );
160+ 		assertEquals ( expected , resultCount  );
161+ 	}
162+ 
163+ 	@ AfterEach 
164+ 	public  void  tearDown (SessionFactoryScope  scope ) {
165+ 		scope .getSessionFactory ().getSchemaManager ().truncateMappedObjects ();
166+ 	}
167+ 
123168	@ Entity (name ="Book" )
124169	@ Table (name  = "books" )
125170	static  class  Book  {
@@ -151,6 +196,15 @@ static class Author {
151196	@ Entity (name ="Publisher" )
152197	@ Table (name  = "pubs" )
153198	static  class  Publisher  {
154- 		@ Id  String  name ;
199+ 		@ Id  Long  id ;
200+ 		String  name ;
201+ 
202+ 		Publisher () {
203+ 		}
204+ 
205+ 		Publisher (Long  id , String  name ) {
206+ 			this .id  = id ;
207+ 			this .name  = name ;
208+ 		}
155209	}
156210}
0 commit comments