This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch merge-hibernate6
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 39aabb26e38421566c3972675206b943827f2070
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Fri Jun 27 22:17:31 2025 -0400

    More refactoring
---
 .../orm/hibernate/query/PredicateGenerator.java    | 203 +++++++++++----------
 1 file changed, 107 insertions(+), 96 deletions(-)

diff --git 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
index 204cf3f3d1..e8aadd5628 100644
--- 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
+++ 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
@@ -33,6 +33,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 
 @Slf4j
@@ -42,21 +43,21 @@ public class PredicateGenerator {
     public static Predicate[] getPredicates(HibernateCriteriaBuilder cb,
                                             CriteriaQuery criteriaQuery,
                                             From root_,
-                                            List<Query.Criterion> 
criteriaList, JpaFromProvider tablesByName) {
+                                            List<Query.Criterion> 
criteriaList, JpaFromProvider fromsByProvider) {
 
 
         List<Predicate> list = criteriaList.stream().
                 map(criterion -> {
                     if (criterion instanceof Query.Disjunction) {
                         List<Query.Criterion> criterionList = 
((Query.Disjunction) criterion).getCriteria();
-                        return cb.or(getPredicates(cb, criteriaQuery, root_, 
criterionList, tablesByName));
+                        return cb.or(getPredicates(cb, criteriaQuery, root_, 
criterionList, fromsByProvider));
 
                     } else if (criterion instanceof Query.Conjunction) {
                         List<Query.Criterion> criterionList = 
((Query.Conjunction) criterion).getCriteria();
-                        return cb.and(getPredicates(cb, criteriaQuery, root_, 
criterionList, tablesByName));
+                        return cb.and(getPredicates(cb, criteriaQuery, root_, 
criterionList, fromsByProvider));
                     } else if (criterion instanceof Query.Negation) {
                         List<Query.Criterion> criterionList = 
((Query.Negation) criterion).getCriteria();
-                        Predicate[] predicates = getPredicates(cb, 
criteriaQuery, root_, criterionList, tablesByName);
+                        Predicate[] predicates = getPredicates(cb, 
criteriaQuery, root_, criterionList, fromsByProvider);
                         if (predicates.length != 1) {
                             log.error("Must have a single predicate behind a 
not");
                             throw new RuntimeException("Must have a single 
predicate behind a not");
@@ -68,141 +69,122 @@ public class PredicateGenerator {
                     } else if (criterion instanceof 
DetachedAssociationCriteria<?> c) {
                             Join child = root_.join(c.getAssociationPath(), 
JoinType.LEFT);
                             List<Query.Criterion> criterionList = 
c.getCriteria();
-                            JpaFromProvider childTablesByName = 
(JpaFromProvider )tablesByName.clone();
+                            JpaFromProvider childTablesByName = 
(JpaFromProvider )fromsByProvider.clone();
                             childTablesByName.put("root",child);
                             return cb.and(getPredicates(cb, criteriaQuery, 
child, criterionList, childTablesByName));
                     } else if (criterion instanceof Query.IsNull c) {
-                        return 
cb.isNull(tablesByName.getFullyQualifiedPath(c.getProperty()));
+                        return 
cb.isNull(fromsByProvider.getFullyQualifiedPath(c.getProperty()));
                     } else if (criterion instanceof Query.IsNotNull c) {
-                        return 
cb.isNotNull(tablesByName.getFullyQualifiedPath(c.getProperty()));
+                        return 
cb.isNotNull(fromsByProvider.getFullyQualifiedPath(c.getProperty()));
                     } else if (criterion instanceof Query.IsEmpty c) {
-                        return 
cb.isEmpty(tablesByName.getFullyQualifiedPath(c.getProperty()));
+                        return 
cb.isEmpty(fromsByProvider.getFullyQualifiedPath(c.getProperty()));
                     } else if (criterion instanceof Query.Equals c) {
-                        return 
cb.equal(tablesByName.getFullyQualifiedPath(c.getProperty()), c.getValue());
+                        return 
cb.equal(fromsByProvider.getFullyQualifiedPath(c.getProperty()), c.getValue());
                     } else if (criterion instanceof Query.NotEquals c) {
-                        return 
cb.notEqual(tablesByName.getFullyQualifiedPath(c.getProperty()), c.getValue());
+                        return 
cb.notEqual(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue());
                     } else if (criterion instanceof Query.EqualsProperty c) {
-                        return 
cb.equal(tablesByName.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
+                        return 
cb.equal(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
                     } else if (criterion instanceof Query.NotEqualsProperty c) 
{
-                        return 
cb.notEqual(tablesByName.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
+                        return 
cb.notEqual(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
                     } else if (criterion instanceof 
Query.LessThanEqualsProperty c) {
-                        return 
cb.le(tablesByName.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
+                        return 
cb.le(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
                     } else if (criterion instanceof Query.LessThanProperty c) {
-                        return 
cb.lt(tablesByName.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
+                        return 
cb.lt(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
                     } else if (criterion instanceof 
Query.GreaterThanEqualsProperty c) {
-                        return 
cb.ge(tablesByName.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
+                        return 
cb.ge(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
                     } else if (criterion instanceof Query.GreaterThanProperty 
c) {
-                        return 
cb.gt(tablesByName.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
+                        return 
cb.gt(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
root_.get(c.getOtherProperty()));
                     } else if (criterion instanceof Query.IdEquals c) {
                         return cb.equal(root_.get("id"), c.getValue());
                     } else if (criterion instanceof Query.GreaterThan c) {
-                        return 
cb.gt(tablesByName.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
+                        return 
cb.gt(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.GreaterThanEquals c) 
{
-                        return 
cb.ge(tablesByName.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
+                        return 
cb.ge(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.LessThan c) {
-                        return 
cb.lt(tablesByName.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
+                        return 
cb.lt(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.LessThanEquals c) {
-                        return 
cb.le(tablesByName.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
+                        return 
cb.le(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.SizeEquals c) {
-                        return 
cb.equal(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
+                        return 
cb.equal(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
                     } else if (criterion instanceof Query.SizeNotEquals c) {
-                        return 
cb.notEqual(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
+                        return 
cb.notEqual(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
                     } else if (criterion instanceof Query.SizeGreaterThan c) {
-                        return 
cb.gt(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.gt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof 
Query.SizeGreaterThanEquals c) {
-                        return 
cb.ge(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.ge(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.SizeLessThan c) {
-                        return 
cb.lt(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.lt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.SizeLessThanEquals 
c) {
-                        return 
cb.le(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.le(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.Between c) {
                         if (c.getFrom() instanceof String && c.getTo() 
instanceof String) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (String) 
c.getFrom(), (String) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (String) 
c.getFrom(), (String) c.getTo());
                         } else if (c.getFrom() instanceof Short && c.getTo() 
instanceof Short) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (Short) 
c.getFrom(), (Short) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Short) 
c.getFrom(), (Short) c.getTo());
                         } else if (c.getFrom() instanceof Integer && c.getTo() 
instanceof Integer) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (Integer) 
c.getFrom(), (Integer) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Integer) 
c.getFrom(), (Integer) c.getTo());
                         } else if (c.getFrom() instanceof Long && c.getTo() 
instanceof Long) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (Long) 
c.getFrom(), (Long) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Long) 
c.getFrom(), (Long) c.getTo());
                         } else if (c.getFrom() instanceof Date && c.getTo() 
instanceof Date) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (Date) 
c.getFrom(), (Date) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Date) 
c.getFrom(), (Date) c.getTo());
                         } else if (c.getFrom() instanceof Instant && c.getTo() 
instanceof Instant) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (Instant) 
c.getFrom(), (Instant) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Instant) 
c.getFrom(), (Instant) c.getTo());
                         } else if (c.getFrom() instanceof LocalDate && 
c.getTo() instanceof LocalDate) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (LocalDate) 
c.getFrom(), (LocalDate) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (LocalDate) 
c.getFrom(), (LocalDate) c.getTo());
                         } else if (c.getFrom() instanceof LocalDateTime && 
c.getTo() instanceof LocalDateTime) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (LocalDateTime) 
c.getFrom(), (LocalDateTime) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
(LocalDateTime) c.getFrom(), (LocalDateTime) c.getTo());
                         } else if (c.getFrom() instanceof OffsetDateTime && 
c.getTo() instanceof OffsetDateTime) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), 
(OffsetDateTime) c.getFrom(), (OffsetDateTime) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
(OffsetDateTime) c.getFrom(), (OffsetDateTime) c.getTo());
                         } else if (c.getFrom() instanceof ZonedDateTime && 
c.getTo() instanceof ZonedDateTime) {
-                            return 
cb.between(tablesByName.getFullyQualifiedPath(c.getProperty()), (ZonedDateTime) 
c.getFrom(), (ZonedDateTime) c.getTo());
+                            return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
(ZonedDateTime) c.getFrom(), (ZonedDateTime) c.getTo());
                         }
                     } else if (criterion instanceof Query.ILike c) {
-                        return 
cb.ilike(tablesByName.getFullyQualifiedPath(c.getProperty()), 
c.getValue().toString());
+                        return 
cb.ilike(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue().toString());
                     } else if (criterion instanceof Query.RLike c) {
-                        return 
cb.like(tablesByName.getFullyQualifiedPath(c.getProperty()), c.getPattern(), 
'\\');
+                        return 
cb.like(fromsByProvider.getFullyQualifiedPath(c.getProperty()), c.getPattern(), 
'\\');
                     } else if (criterion instanceof Query.Like c) {
-                        return 
cb.like(tablesByName.getFullyQualifiedPath(c.getProperty()), 
c.getValue().toString());
+                        return 
cb.like(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue().toString());
                     } else if (criterion instanceof Query.SizeEquals c) {
-                        return 
cb.equal(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
+                        return 
cb.equal(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
                     } else if (criterion instanceof Query.SizeGreaterThan c) {
-                        return 
cb.gt(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.gt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof 
Query.SizeGreaterThanEquals c) {
-                        return 
cb.ge(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.ge(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.SizeLessThan c) {
-                        return 
cb.lt(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.lt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if (criterion instanceof Query.SizeLessThanEquals 
c) {
-                        return 
cb.le(cb.size(tablesByName.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
+                        return 
cb.le(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), (Number) 
c.getValue());
                     } else if(criterion instanceof Query.In || criterion 
instanceof Query.NotIn) {
-                        Path path;
-                        QueryableCriteria queryableCriteria;
-                       if (criterion instanceof Query.In in ) {
-                           path = 
tablesByName.getFullyQualifiedPath(in.getProperty());
-                           queryableCriteria =  in.getSubquery();
-                       } else {
-                           Query.NotIn notIn = (Query.NotIn) criterion;
-                           path =  
tablesByName.getFullyQualifiedPath(notIn.getProperty());
-                           queryableCriteria =  notIn.getSubquery();
-                       }
+                        var queryableCriteria = 
getQueryableCriteriaFromInCriteria(criterion);
                         if (Objects.nonNull(queryableCriteria)) {
-                            Query.Projection projection = 
!queryableCriteria.getProjections().isEmpty() ?
-                                    (Query.Projection 
)queryableCriteria.getProjections().get(0) : new Query.IdProjection() ;
-                            String subProperty;
-                            JpaInPredicate in;
-                            if (projection instanceof 
Query.PropertyProjection) {
-                                subProperty = ((Query.PropertyProjection) 
projection).getPropertyName();
-                                in =cb.in(path);
-                            } else if (projection instanceof 
Query.IdProjection) {
-                                subProperty = "id";
-                                in =cb.in(((SqmPath)path).get(subProperty));
-                            } else {
-                                throw new IllegalStateException("Unsupported 
projection type: " + projection);
-                            }
-                            boolean distinct =  "id".equals(subProperty) || 
projection instanceof Query.DistinctPropertyProjection;
 
-                            Subquery subquery = 
criteriaQuery.subquery(getJavaTypeOfInClause((SqmInListPredicate) in));
-                            Root from = 
subquery.from(queryableCriteria.getPersistentEntity().getJavaClass());
-                            List subCriteria = queryableCriteria.getCriteria();
-                            JpaFromProvider newMap = (JpaFromProvider) 
tablesByName.clone();
-                            newMap.put("root", from);
-                            Predicate[] predicates = getPredicates(cb, 
criteriaQuery, from, subCriteria, newMap);
-                            subquery.select(
-                                    newMap.getFullyQualifiedPath(subProperty)
-                            ).distinct(distinct).where(cb.and(predicates));
+                            var projection = 
findPropertyOrIdProjection(queryableCriteria);
+                            var subProperty = findSubproperty(projection);
+                            var path = getPathFromInCriterion(fromsByProvider, 
(Query.PropertyNameCriterion) criterion);
+                            var in = findInPredicate(cb, projection, path, 
subProperty);
+                            var subquery = 
criteriaQuery.subquery(getJavaTypeOfInClause((SqmInListPredicate) in));
+                            var from = 
subquery.from(queryableCriteria.getPersistentEntity().getJavaClass());
+                            var subCriteria = queryableCriteria.getCriteria();
+                            var clonedProviderByName = (JpaFromProvider) 
fromsByProvider.clone();
+                            clonedProviderByName.put("root", from);
+                            var predicates = getPredicates(cb, criteriaQuery, 
from, subCriteria, clonedProviderByName);
+                            
subquery.select(clonedProviderByName.getFullyQualifiedPath(subProperty))
+                                    .distinct(true)
+                                    .where(cb.and(predicates));
                             CriteriaBuilder.In value = in.value(subquery);
                             if (criterion instanceof Query.In) {
                                 return value;
                             }
                             return cb.not(value);
                         } else if (criterion instanceof Query.In c && 
!c.getValues().isEmpty()) {
-                            return 
cb.in(tablesByName.getFullyQualifiedPath(c.getProperty()), c.getValues());
+                            return 
cb.in(fromsByProvider.getFullyQualifiedPath(c.getProperty()), c.getValues());
                         } else if (criterion instanceof Query.NotIn c) {
-                            return 
cb.not(cb.in(tablesByName.getFullyQualifiedPath(c.getProperty()), 
c.getValue()));
+                            return 
cb.not(cb.in(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue()));
                         }
                     } else if (criterion instanceof Query.Exists c) {
                         Subquery subquery = 
criteriaQuery.subquery(Object.class);
                         Root subRoot = 
subquery.from(c.getSubquery().getPersistentEntity().getJavaClass());
-                        JpaFromProvider newMap = (JpaFromProvider) 
tablesByName.clone();
+                        JpaFromProvider newMap = (JpaFromProvider) 
fromsByProvider.clone();
                         newMap.put("root", subRoot);
                         Predicate[] predicates = getPredicates(cb, 
criteriaQuery, subRoot, c.getSubquery().getCriteria(), newMap);
                         
subquery.select(cb.literal(1)).where(cb.and(predicates));
@@ -210,45 +192,45 @@ public class PredicateGenerator {
                     } else if (criterion instanceof Query.NotExists c) {
                         Subquery subquery = 
criteriaQuery.subquery(Object.class);
                         Root subRoot = 
subquery.from(c.getSubquery().getPersistentEntity().getJavaClass());
-                        JpaFromProvider newMap = (JpaFromProvider) 
tablesByName.clone();
+                        JpaFromProvider newMap = (JpaFromProvider) 
fromsByProvider.clone();
                         newMap.put("root", subRoot);
-                        Predicate[] predicates = getPredicates(cb, 
criteriaQuery, subRoot, c.getSubquery().getCriteria(), tablesByName);
+                        Predicate[] predicates = getPredicates(cb, 
criteriaQuery, subRoot, c.getSubquery().getCriteria(), fromsByProvider);
                         
subquery.select(cb.literal(1)).where(cb.and(predicates));
                         return cb.not(cb.exists(subquery));
                     } else if (criterion instanceof Query.SubqueryCriterion c) 
{
                         Subquery subquery = 
criteriaQuery.subquery(Number.class);
                         Root from = 
subquery.from(c.getValue().getPersistentEntity().getJavaClass());
                         List subCriteria = c.getValue().getCriteria();
-                        JpaFromProvider newMap = (JpaFromProvider) 
tablesByName.clone();
+                        JpaFromProvider newMap = (JpaFromProvider) 
fromsByProvider.clone();
                         newMap.put("root", from);
                         Predicate[] predicates = getPredicates(cb, 
criteriaQuery, from, subCriteria, newMap);
                         if (c instanceof Query.GreaterThanEqualsAll sc) {
                             
subquery.select(cb.max(from.get(c.getProperty()))).where(cb.and(predicates));
-                            return 
cb.greaterThanOrEqualTo(tablesByName.getFullyQualifiedPath(sc.getProperty()), 
subquery);
+                            return 
cb.greaterThanOrEqualTo(fromsByProvider.getFullyQualifiedPath(sc.getProperty()),
 subquery);
                         } else if (c instanceof Query.GreaterThanAll sc) {
                             
subquery.select(cb.max(from.get(c.getProperty()))).where(cb.and(predicates));
-                            return 
cb.greaterThan(tablesByName.getFullyQualifiedPath(sc.getProperty()), subquery);
+                            return 
cb.greaterThan(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), 
subquery);
                         } else if (c instanceof Query.LessThanEqualsAll sc) {
                             
subquery.select(cb.min(from.get(c.getProperty()))).where(cb.and(predicates));
-                            return 
cb.lessThanOrEqualTo(tablesByName.getFullyQualifiedPath(sc.getProperty()), 
subquery);
+                            return 
cb.lessThanOrEqualTo(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), 
subquery);
                         } else if (c instanceof Query.LessThanAll sc) {
                             
subquery.select(cb.min(from.get(c.getProperty()))).where(cb.and(predicates));
-                            return 
cb.lessThan(tablesByName.getFullyQualifiedPath(sc.getProperty()), subquery);
+                            return 
cb.lessThan(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), subquery);
                         } else if (c instanceof Query.EqualsAll sc) {
                             
subquery.select(from.get(c.getProperty())).where(cb.and(predicates));
-                            return 
cb.equal(tablesByName.getFullyQualifiedPath(sc.getProperty()), subquery);
+                            return 
cb.equal(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), subquery);
                         } else if (c instanceof Query.GreaterThanEqualsSome 
sc) {
                             
subquery.select(cb.max(from.get(c.getProperty()))).where(cb.or(predicates));
-                            return 
cb.greaterThanOrEqualTo(tablesByName.getFullyQualifiedPath(sc.getProperty()), 
subquery);
+                            return 
cb.greaterThanOrEqualTo(fromsByProvider.getFullyQualifiedPath(sc.getProperty()),
 subquery);
                         } else if (c instanceof Query.GreaterThanSome sc) {
                             
subquery.select(cb.max(from.get(c.getProperty()))).where(cb.or(predicates));
-                            return 
cb.greaterThan(tablesByName.getFullyQualifiedPath(sc.getProperty()), subquery);
+                            return 
cb.greaterThan(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), 
subquery);
                         } else if (c instanceof Query.LessThanEqualsSome sc) {
                             
subquery.select(cb.min(from.get(c.getProperty()))).where(cb.or(predicates));
-                            return 
cb.lessThanOrEqualTo(tablesByName.getFullyQualifiedPath(sc.getProperty()), 
subquery);
+                            return 
cb.lessThanOrEqualTo(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), 
subquery);
                         } else if (c instanceof Query.LessThanSome sc) {
                             
subquery.select(cb.min(from.get(c.getProperty()))).where(cb.or(predicates));
-                            return 
cb.lessThan(tablesByName.getFullyQualifiedPath(sc.getProperty()), subquery);
+                            return 
cb.lessThan(fromsByProvider.getFullyQualifiedPath(sc.getProperty()), subquery);
                         } else if (criterion instanceof Query.NotIn sc
                                 && Objects.nonNull(sc.getSubquery())
                                 && !sc.getSubquery().getProjections().isEmpty()
@@ -257,7 +239,7 @@ public class PredicateGenerator {
                             Query.PropertyProjection projection = 
(Query.PropertyProjection) sc.getSubquery().getProjections().get(0);
                             boolean distinct = projection instanceof 
Query.DistinctPropertyProjection;
                             
subquery.select(from.get(projection.getPropertyName())).distinct(distinct).where(cb.and(predicates));
-                            return 
cb.in(tablesByName.getFullyQualifiedPath(sc.getProperty())).value(subquery);
+                            return 
cb.in(fromsByProvider.getFullyQualifiedPath(sc.getProperty())).value(subquery);
                         } else if (criterion instanceof Query.NotIn sc
                                 && Objects.nonNull(sc.getSubquery())
                                 && !sc.getSubquery().getProjections().isEmpty()
@@ -275,11 +257,40 @@ public class PredicateGenerator {
         return list.toArray(new Predicate[0]);
     }
 
+    @SuppressWarnings("rawtypes")
+    private static JpaInPredicate findInPredicate(HibernateCriteriaBuilder cb, 
Object projection, Path path, String subProperty) {
+        return projection instanceof Query.PropertyProjection ? cb.in(path) : 
cb.in(((SqmPath) path).get(subProperty));
+    }
 
+    private static String findSubproperty(Object projection) {
+        return projection instanceof Query.PropertyProjection ? 
((Query.PropertyProjection) projection).getPropertyName() :"id" ;
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Query.Projection 
findPropertyOrIdProjection(QueryableCriteria queryableCriteria) {
+        return (Query.Projection ) queryableCriteria.getProjections()
+                .stream().
+                filter(projection1 -> projection1 instanceof 
Query.PropertyProjection || projection1 instanceof Query.IdProjection)
+                .findFirst()
+                .orElse(new Query.IdProjection());
+    }
+
+    @SuppressWarnings("rawtypes")
+    private static QueryableCriteria 
getQueryableCriteriaFromInCriteria(Query.Criterion criterion) {
+        return criterion instanceof Query.In  ? ((Query.In) 
criterion).getSubquery() : ((Query.NotIn) criterion).getSubquery();
+    }
+
+    @SuppressWarnings("rawtypes")
+    private static Path getPathFromInCriterion(JpaFromProvider tablesByName, 
Query.PropertyNameCriterion criterion) {
+        return tablesByName.getFullyQualifiedPath(criterion.getProperty());
+    }
 
 
-    private static Class getJavaTypeOfInClause(SqmInListPredicate in) {
-        Class javaTypeOfInClause = 
in.getTestExpression().getExpressible().getExpressibleJavaType().getJavaTypeClass();
-        return javaTypeOfInClause;
+    @SuppressWarnings("rawtypes")
+    private static Class getJavaTypeOfInClause(SqmInListPredicate predicate) {
+        return Optional.ofNullable(predicate.getTestExpression()
+                .getExpressible())
+                .map(expressible ->  
expressible.getExpressibleJavaType().getJavaTypeClass())
+                .orElse(null);
     }
 }

Reply via email to