|
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