@@ -335,32 +335,23 @@ protected TypedQuery<Object> getKeysQuery(DataFetchingEnvironment environment, F
335
335
}
336
336
337
337
protected Map <Object , List <Object >> loadOneToMany (DataFetchingEnvironment environment ,
338
- Set <Object > keys ) {
338
+ Set <Object > keys ) {
339
339
Field field = environment .getField ();
340
340
341
341
TypedQuery <Object []> query = getBatchQuery (environment , field , isDefaultDistinct (), keys );
342
342
343
- if (logger .isDebugEnabled ()) {
344
- logger .info ("\n GraphQL JPQL Batch Query String:\n {}" , getJPQLQueryString (query ));
345
- }
346
-
347
- List <Object []> resultList = query .getResultList ();
343
+ List <Object []> resultList = getResultList (query );
348
344
349
345
Map <Object , List <Object >> batch = resultList .stream ()
346
+ .peek (t -> entityManager .detach (t [1 ]))
350
347
.collect (groupingBy (t -> t [0 ],
351
348
Collectors .mapping (t -> t [1 ],
352
349
GraphQLSupport .toResultList ())));
353
- Map <Object , List <Object >> resultMap = new LinkedHashMap <>();
350
+ Map <Object , List <Object >> resultMap = new LinkedHashMap <>(keys . size () );
354
351
355
352
keys .forEach (it -> {
356
353
List <Object > list = batch .getOrDefault (it , Collections .emptyList ());
357
354
358
- if (!list .isEmpty ()) {
359
- list = list .stream ()
360
- .filter (GraphQLSupport .distinctByKey (GraphQLSupport ::identityToString ))
361
- .collect (Collectors .toList ());
362
- }
363
-
364
355
resultMap .put (it , list );
365
356
});
366
357
@@ -369,30 +360,33 @@ protected Map<Object, List<Object>> loadOneToMany(DataFetchingEnvironment enviro
369
360
370
361
protected Map <Object , Object > loadManyToOne (DataFetchingEnvironment environment ,
371
362
Set <Object > keys ) {
372
- Field field = environment .getField ();
373
-
374
- TypedQuery <Object []> query = getBatchQuery (environment , field , isDefaultDistinct (), keys );
363
+ Field field = environment .getField ();
375
364
376
- if (logger .isDebugEnabled ()) {
377
- logger .info ("\n GraphQL JPQL Batch Query String:\n {}" , getJPQLQueryString (query ));
378
- }
365
+ TypedQuery <Object []> query = getBatchQuery (environment , field , isDefaultDistinct (), keys );
379
366
380
- List <Object []> resultList = query . getResultList ();
367
+ List <Object []> resultList = getResultList (query );
381
368
382
- Map <Object , Object > batch = new LinkedHashMap <>();
369
+ Map <Object , Object > resultMap = new LinkedHashMap <>(resultList . size () );
383
370
384
- resultList .forEach (item -> batch .put (item [0 ], item [1 ]));
371
+ resultList .stream ()
372
+ .peek (t -> entityManager .detach (t [1 ]))
373
+ .forEach (item -> resultMap .put (item [0 ], item [1 ]));
385
374
386
- Map <Object , Object > resultMap = new LinkedHashMap <>();
375
+ return resultMap ;
376
+ }
387
377
388
- keys .forEach (it -> {
389
- Object list = batch .getOrDefault (it , null );
378
+ protected <T > List <T > getResultList (TypedQuery <T > query ) {
379
+ if (logger .isDebugEnabled ()) {
380
+ logger .info ("\n GraphQL JPQL Batch Query String:\n {}" , getJPQLQueryString (query ));
381
+ }
390
382
391
- resultMap .put (it , list );
392
- });
383
+ // Let' try reduce overhead and disable all caching
384
+ query .setHint (ORG_HIBERNATE_READ_ONLY , true );
385
+ query .setHint (ORG_HIBERNATE_FETCH_SIZE , defaultFetchSize );
386
+ query .setHint (ORG_HIBERNATE_CACHEABLE , false );
393
387
394
- return resultMap ;
395
- }
388
+ return query . getResultList () ;
389
+ }
396
390
397
391
@ SuppressWarnings ( { "rawtypes" , "unchecked" } )
398
392
protected TypedQuery <Object []> getBatchQuery (DataFetchingEnvironment environment , Field field , boolean isDistinct , Set <Object > keys ) {
@@ -599,11 +593,8 @@ protected final List<Predicate> getFieldPredicates(Field field, CriteriaQuery<?>
599
593
// Let's join fetch element collections to avoid filtering their values used where search criteria
600
594
if (PersistentAttributeType .ELEMENT_COLLECTION == attribute .getPersistentAttributeType ()) {
601
595
from .fetch (selection .getName (), JoinType .LEFT );
602
- } else if (!whereArgument .isPresent ()) {
603
- // Let's apply fetch join to retrieve associated plural attributes
604
- if (!hasAnySelectionOrderBy (selection )) {
605
- fetch = reuseFetch (from , selection .getName (), isOptional );
606
- }
596
+ } else if (!whereArgument .isPresent () && !hasAnySelectionOrderBy (selection )) {
597
+ fetch = reuseFetch (from , selection .getName (), isOptional );
607
598
}
608
599
}
609
600
// Let's build join fetch graph to avoid Hibernate error:
0 commit comments