@@ -159,7 +159,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
159159 if (!TYPENAME .equals (selectedField .getName ()) && !IntrospectionUtils .isTransient (from .getJavaType (), selectedField .getName ())) {
160160
161161 Path <?> fieldPath = from .get (selectedField .getName ());
162- Join <?,?> join = null ;
162+ From <?,?> fetch = null ;
163163 Optional <Argument > optionalArgument = getArgument (selectedField , OPTIONAL );
164164
165165 // Build predicate arguments for singular attributes only
@@ -194,7 +194,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
194194 .orElse (attribute .isOptional ());
195195
196196 // Let's apply left outer join to retrieve optional associations
197- join = reuseJoin (from , selectedField .getName (), isOptional );
197+ fetch = reuseFetch (from , selectedField .getName (), isOptional );
198198 }
199199 }
200200 } else {
@@ -205,7 +205,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
205205 .orElse (toManyDefaultOptional );
206206
207207 // Let's apply join to retrieve associated collection
208- join = reuseJoin (from , selectedField .getName (), isOptional );
208+ fetch = reuseFetch (from , selectedField .getName (), isOptional );
209209
210210 // TODO add fetch argument parameter
211211 // Let's fetch element collections to avoid filtering their values used where search criteria
@@ -215,7 +215,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
215215
216216 // Let's build join fetch graph to avoid Hibernate error:
217217 // "query specified join fetching, but the owner of the fetched association was not present in the select list"
218- if (join != null && selectedField .getSelectionSet () != null ) {
218+ if (fetch != null && selectedField .getSelectionSet () != null ) {
219219 GraphQLFieldDefinition fieldDefinition = getFieldDef (environment .getGraphQLSchema (),
220220 this .getObjectType (environment ),
221221 selectedField );
@@ -225,7 +225,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
225225 fieldDefinition ,
226226 args );
227227 // TODO nested where criteria expressions
228- getFieldArguments (selectedField , query , cb , join , fieldEnvironment );
228+ getFieldArguments (selectedField , query , cb , fetch , fieldEnvironment );
229229 }
230230 }
231231 }
@@ -317,7 +317,7 @@ protected Predicate getPredicate(CriteriaBuilder cb, Root<?> from, From<?,?> pat
317317 // If the argument is a list, let's assume we need to join and do an 'in' clause
318318 if (argumentEntityAttribute instanceof PluralAttribute ) {
319319 // Apply left outer join to retrieve optional associations
320- return reuseJoin (from , argument .getName (), false )
320+ return reuseFetch (from , argument .getName (), false )
321321 .in (convertValue (environment , argument , argument .getValue ()));
322322 }
323323
@@ -373,7 +373,7 @@ protected Predicate getWherePredicate(CriteriaBuilder cb, Root<?> root, From<?,
373373 return getArgumentPredicate (cb , (path != null ) ? path : root , predicateDataFetchingEnvironment , predicateArgument );
374374 }
375375
376- protected Predicate getArgumentPredicate (CriteriaBuilder cb , From <?,?> path ,
376+ protected Predicate getArgumentPredicate (CriteriaBuilder cb , From <?,?> from ,
377377 DataFetchingEnvironment environment , Argument argument ) {
378378 ObjectValue whereValue = getValue (argument );
379379
@@ -390,12 +390,12 @@ protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
390390 Map <String , Object > arguments = getFieldArguments (environment , it , argument );
391391
392392 if (it .getValue () instanceof ArrayValue ) {
393- return getArrayArgumentPredicate (cb , path ,
393+ return getArgumentsPredicate (cb , from ,
394394 argumentEnvironment (environment , arguments ),
395395 new Argument (it .getName (), it .getValue ()));
396396 }
397397
398- return getArgumentPredicate (cb , path ,
398+ return getArgumentPredicate (cb , from ,
399399 argumentEnvironment (environment , arguments ),
400400 new Argument (it .getName (), it .getValue ()));
401401 })
@@ -417,15 +417,15 @@ protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
417417 new Field (it .getName ()));
418418 boolean isOptional = false ;
419419
420- return getArgumentPredicate (cb , reuseJoin ( path , it .getName (), isOptional ),
420+ return getArgumentPredicate (cb , reuseFetch ( from , it .getName (), isOptional ),
421421 wherePredicateEnvironment (environment , fieldDefinition , args ),
422422 arg );
423423 }
424424 }
425425
426- return getFieldPredicate (it .getName (),
426+ return getLogicalPredicate (it .getName (),
427427 cb ,
428- path ,
428+ from ,
429429 it ,
430430 argumentEnvironment (environment , args ),
431431 arg );
@@ -436,7 +436,7 @@ protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
436436 return getCompoundPredicate (cb , predicates , logical );
437437 }
438438
439- protected Predicate getArrayArgumentPredicate (CriteriaBuilder cb ,
439+ protected Predicate getArgumentsPredicate (CriteriaBuilder cb ,
440440 From <?, ?> path ,
441441 DataFetchingEnvironment environment ,
442442 Argument argument ) {
@@ -470,7 +470,7 @@ protected Predicate getArrayArgumentPredicate(CriteriaBuilder cb,
470470 Argument arg = new Argument (it .getName (), it .getValue ());
471471
472472 if (ArrayValue .class .isInstance (it .getValue ())) {
473- return getArrayArgumentPredicate (cb ,
473+ return getArgumentsPredicate (cb ,
474474 path ,
475475 argumentEnvironment (environment , args ),
476476 arg );
@@ -502,13 +502,13 @@ protected Predicate getArrayArgumentPredicate(CriteriaBuilder cb,
502502 new Field (it .getName ()));
503503 boolean isOptional = false ;
504504
505- return getArgumentPredicate (cb , reuseJoin (path , it .getName (), isOptional ),
505+ return getArgumentPredicate (cb , reuseFetch (path , it .getName (), isOptional ),
506506 wherePredicateEnvironment (environment , fieldDefinition , args ),
507507 arg );
508508 }
509509 }
510510
511- return getFieldPredicate (it .getName (),
511+ return getLogicalPredicate (it .getName (),
512512 cb ,
513513 path ,
514514 it ,
@@ -545,7 +545,7 @@ private Logical extractLogical(Argument argument) {
545545 .orElse (Logical .AND );
546546 }
547547
548- private Predicate getArrayFieldPredicate (String fieldName ,
548+ private Predicate getLogicalPredicates (String fieldName ,
549549 CriteriaBuilder cb ,
550550 From <?, ?> path ,
551551 ObjectField objectField ,
@@ -565,7 +565,7 @@ private Predicate getArrayFieldPredicate(String fieldName,
565565 Map <String , Object > args = getFieldArguments (environment , it , argument );
566566 Argument arg = new Argument (it .getName (), it .getValue ());
567567
568- return getFieldPredicate (it .getName (),
568+ return getLogicalPredicate (it .getName (),
569569 cb ,
570570 path ,
571571 it ,
@@ -577,7 +577,7 @@ private Predicate getArrayFieldPredicate(String fieldName,
577577 return getCompoundPredicate (cb , predicates , logical );
578578 }
579579
580- private Predicate getFieldPredicate (String fieldName , CriteriaBuilder cb , From <?,?> path , ObjectField objectField , DataFetchingEnvironment environment , Argument argument ) {
580+ private Predicate getLogicalPredicate (String fieldName , CriteriaBuilder cb , From <?,?> path , ObjectField objectField , DataFetchingEnvironment environment , Argument argument ) {
581581 ObjectValue expressionValue ;
582582
583583 if (objectField .getValue () instanceof ObjectValue )
@@ -600,12 +600,12 @@ private Predicate getFieldPredicate(String fieldName, CriteriaBuilder cb, From<?
600600 Argument arg = new Argument (it .getName (), it .getValue ());
601601
602602 if (it .getValue () instanceof ArrayValue ) {
603- return getArrayFieldPredicate (fieldName , cb , path , it ,
603+ return getLogicalPredicates (fieldName , cb , path , it ,
604604 argumentEnvironment (environment , args ),
605605 arg );
606606 }
607607
608- return getFieldPredicate (fieldName , cb , path , it ,
608+ return getLogicalPredicate (fieldName , cb , path , it ,
609609 argumentEnvironment (environment , args ),
610610 arg );
611611 })
@@ -631,7 +631,7 @@ private Predicate getFieldPredicate(String fieldName, CriteriaBuilder cb, From<?
631631 isOptional = isOptionalAttribute (getAttribute (environment , argument ));
632632 }
633633
634- return getArgumentPredicate (cb , reuseJoin (path , fieldName , isOptional ),
634+ return getArgumentPredicate (cb , reuseFetch (path , fieldName , isOptional ),
635635 wherePredicateEnvironment (environment , fieldDefinition , args ),
636636 arg );
637637 }
@@ -760,16 +760,27 @@ private Path<?> getCompoundJoinedPath(From<?,?> rootPath, String fieldName, bool
760760 }
761761
762762 // trying to find already existing joins to reuse
763- private Join <?,?> reuseJoin (From <?, ?> path , String fieldName , boolean outer ) {
763+ private Join <?,?> reuseJoin (From <?, ?> from , String fieldName , boolean outer ) {
764764
765- for (Fetch <?,?> join : path . getFetches ()) {
765+ for (Join <?,?> join : from . getJoins ()) {
766766 if (join .getAttribute ().getName ().equals (fieldName )) {
767- return ( Join <?,?>) join ;
767+ return join ;
768768 }
769769 }
770- return outer ? ( Join <?,?>) path . fetch (fieldName , JoinType .LEFT ) : ( Join <?,?>) path . fetch (fieldName );
770+ return outer ? from . join (fieldName , JoinType .LEFT ) : from . join (fieldName );
771771 }
772772
773+ // trying to find already existing fetch joins to reuse
774+ private From <?,?> reuseFetch (From <?, ?> from , String fieldName , boolean outer ) {
775+
776+ for (Fetch <?,?> fetch : from .getFetches ()) {
777+ if (fetch .getAttribute ().getName ().equals (fieldName )) {
778+ return (From <?,?>) fetch ;
779+ }
780+ }
781+ return outer ? (From <?,?>) from .fetch (fieldName , JoinType .LEFT ) : (From <?,?>) from .fetch (fieldName );
782+ }
783+
773784 @ SuppressWarnings ( { "unchecked" , "rawtypes" } )
774785 protected Object convertValue (DataFetchingEnvironment environment , Argument argument , Value value ) {
775786 if (value instanceof NullValue ) {
0 commit comments