| 
4 | 4 |  */  | 
5 | 5 | package org.hibernate.orm.test.mapping.fetch.subselect;  | 
6 | 6 | 
 
  | 
7 |  | -import java.util.List;  | 
8 |  | - | 
 | 7 | +import jakarta.persistence.criteria.CriteriaBuilder;  | 
 | 8 | +import jakarta.persistence.criteria.CriteriaQuery;  | 
 | 9 | +import jakarta.persistence.criteria.Root;  | 
9 | 10 | import org.hibernate.Hibernate;  | 
10 | 11 | import org.hibernate.cfg.AvailableSettings;  | 
11 | 12 | import org.hibernate.collection.spi.PersistentCollection;  | 
12 |  | - | 
13 | 13 | import org.hibernate.testing.jdbc.SQLStatementInspector;  | 
14 | 14 | import org.hibernate.testing.orm.junit.DomainModel;  | 
15 |  | -import org.hibernate.testing.orm.junit.FailureExpected;  | 
 | 15 | +import org.hibernate.testing.orm.junit.NotImplementedYet;  | 
16 | 16 | import org.hibernate.testing.orm.junit.ServiceRegistry;  | 
17 | 17 | import org.hibernate.testing.orm.junit.SessionFactory;  | 
18 | 18 | import org.hibernate.testing.orm.junit.SessionFactoryScope;  | 
 | 
21 | 21 | import org.junit.jupiter.api.BeforeEach;  | 
22 | 22 | import org.junit.jupiter.api.Test;  | 
23 | 23 | 
 
  | 
24 |  | -import jakarta.persistence.criteria.CriteriaBuilder;  | 
25 |  | -import jakarta.persistence.criteria.CriteriaQuery;  | 
26 |  | -import jakarta.persistence.criteria.JoinType;  | 
27 |  | -import jakarta.persistence.criteria.Root;  | 
 | 24 | +import java.util.List;  | 
28 | 25 | 
 
  | 
29 | 26 | import static org.assertj.core.api.Assertions.assertThat;  | 
30 | 27 | import static org.junit.jupiter.api.Assertions.assertEquals;  | 
 | 
34 | 31 | /**  | 
35 | 32 |  * @author Gavin King  | 
36 | 33 |  */  | 
 | 34 | +@SuppressWarnings("JUnitMalformedDeclaration")  | 
37 | 35 | @ServiceRegistry(  | 
38 | 36 | 		settings = {  | 
39 | 37 | 				@Setting( name = AvailableSettings.GENERATE_STATISTICS, value = "true" ),  | 
 | 
42 | 40 | )  | 
43 | 41 | @DomainModel(xmlMappings = "/mappings/subselectfetch/parent-child.xml")  | 
44 | 42 | @SessionFactory( useCollectingStatementInspector = true )  | 
45 |  | -@FailureExpected(reason = "SUBSELECT fetch defined in mapping.xml not working - https://hibernate.atlassian.net/browse/HHH-19316")  | 
 | 43 | +@NotImplementedYet(reason = "SUBSELECT fetch defined in mapping.xml not working - https://hibernate.atlassian.net/browse/HHH-19316")  | 
46 | 44 | public class SubselectFetchTest {  | 
47 | 45 | 	@BeforeEach  | 
48 | 46 | 	public void prepareTestData(SessionFactoryScope scope) {  | 
@@ -281,24 +279,48 @@ public void testSubselectFetchWithLimit(SessionFactoryScope scope) {  | 
281 | 279 | 	}  | 
282 | 280 | 
 
  | 
283 | 281 | 	@Test  | 
284 |  | -	public void testManyToManyCriteriaJoin(SessionFactoryScope scope) {  | 
285 |  | -		scope.inTransaction(  | 
286 |  | -				s -> {  | 
287 |  | -					CriteriaBuilder criteriaBuilder = s.getCriteriaBuilder();  | 
288 |  | -					CriteriaQuery<Parent> criteria = criteriaBuilder.createQuery( Parent.class );  | 
289 |  | -					Root<Parent> root = criteria.from( Parent.class );  | 
290 |  | -					root.join( "moreChildren", JoinType.INNER )  | 
291 |  | -							.join( "friends", JoinType.INNER );  | 
292 |  | -					criteria.orderBy( criteriaBuilder.desc( root.get( "name" ) ) );  | 
293 |  | - | 
294 |  | -					s.createQuery( criteria ).list();  | 
295 |  | - | 
296 |  | -					criteria = criteriaBuilder.createQuery( Parent.class );  | 
297 |  | -					root = criteria.from( Parent.class );  | 
298 |  | -					root.fetch( "moreChildren", JoinType.LEFT ).fetch( "friends", JoinType.LEFT );  | 
299 |  | -					criteria.orderBy( criteriaBuilder.desc( root.get( "name" ) ) );  | 
 | 282 | +	void testCriteria(SessionFactoryScope scope) {  | 
 | 283 | +		final SQLStatementInspector sqlCollector = scope.getCollectingStatementInspector();  | 
 | 284 | +		sqlCollector.clear();  | 
 | 285 | +		scope.inTransaction( (session) -> {  | 
 | 286 | +			CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();  | 
 | 287 | +			CriteriaQuery<Parent> criteria = criteriaBuilder.createQuery( Parent.class );  | 
 | 288 | +			Root<Parent> root = criteria.from( Parent.class );  | 
 | 289 | +			criteria.where( criteriaBuilder.isNotNull( root.get( "name" ) ) );  | 
 | 290 | +			criteria.orderBy( criteriaBuilder.desc( root.get( "name" ) ) );  | 
 | 291 | + | 
 | 292 | +			final List<Parent> results = session.createQuery( criteria ).list();  | 
 | 293 | +			assertThat( results ).hasSize( 2 );  | 
 | 294 | +			assertThat( sqlCollector.getSqlQueries() ).hasSize( 1 );  | 
 | 295 | + | 
 | 296 | +			sqlCollector.clear();  | 
 | 297 | +			boolean firstPass = true;  | 
 | 298 | +			for ( Parent result : results ) {  | 
 | 299 | +				if ( firstPass ) {  | 
 | 300 | +					firstPass = false;  | 
 | 301 | + | 
 | 302 | +					assertThat( Hibernate.isInitialized( result.getChildren() ) ).isFalse();  | 
 | 303 | +					assertThat( Hibernate.isInitialized( result.getMoreChildren() ) ).isFalse();  | 
 | 304 | + | 
 | 305 | +					// trigger initialization  | 
 | 306 | +					result.getChildren().size();  | 
 | 307 | +					result.getMoreChildren().size();  | 
 | 308 | + | 
 | 309 | +					assertThat( Hibernate.isInitialized( result.getChildren() ) ).isTrue();  | 
 | 310 | +					assertThat( Hibernate.isInitialized( result.getMoreChildren() ) ).isTrue();  | 
 | 311 | + | 
 | 312 | +					// make sure the fetch happened by subselect  | 
 | 313 | +					assertThat( sqlCollector.getSqlQueries() ).hasSize( 2 );  | 
 | 314 | +					assertThat( sqlCollector.getSqlQueries().get( 0 ) ).contains( ".name is not null" );  | 
 | 315 | +					assertThat( sqlCollector.getSqlQueries().get( 1 ) ).contains( ".name is not null" );  | 
300 | 316 | 				}  | 
301 |  | -		);  | 
 | 317 | +				else {  | 
 | 318 | +					// the subselect fetch triggered from first-pass should have initialized all  | 
 | 319 | +					assertThat( Hibernate.isInitialized( result.getChildren() ) ).isTrue();  | 
 | 320 | +					assertThat( Hibernate.isInitialized( result.getMoreChildren() ) ).isTrue();  | 
 | 321 | +				}  | 
 | 322 | +			}  | 
 | 323 | +		} );  | 
302 | 324 | 	}  | 
303 | 325 | 
 
  | 
304 | 326 | 	@Test  | 
 | 
0 commit comments