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

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

commit 04268eed8d5d60dcfabb5aea1b4b4f0f85c629f1
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Thu Feb 19 21:44:41 2026 -0600

    Refactor PredicateGenerator to instance methods and inject into 
JpaCriteriaQueryCreator
---
 .../grails/orm/hibernate/query/HibernateQuery.java |  5 ++-
 .../hibernate/query/JpaCriteriaQueryCreator.java   |  5 ++-
 .../orm/hibernate/query/PredicateGenerator.java    | 36 +++++++++++-----------
 3 files changed, 26 insertions(+), 20 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
index 1f5f5e1918..48b2a5f956 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
@@ -78,6 +78,7 @@ public class HibernateQuery extends Query {
     private boolean hasJoins = false;
     protected DetachedCriteria detachedCriteria;
     protected ProxyHandler proxyHandler = new HibernateProxyHandler();
+    protected PredicateGenerator predicateGenerator;
     private Integer fetchSize;
     private Integer timeout;
     private FlushMode flushMode;
@@ -86,6 +87,7 @@ public class HibernateQuery extends Query {
     public HibernateQuery(AbstractHibernateSession session, PersistentEntity 
entity) {
         super(session, entity);
         this.detachedCriteria = new DetachedCriteria(entity.getJavaClass());
+        this.predicateGenerator = new PredicateGenerator();
     }
 
     public void setDetachedCriteria(DetachedCriteria detachedCriteria) {
@@ -426,7 +428,7 @@ public class HibernateQuery extends Query {
     }
 
     public JpaCriteriaQuery<?> getJpaCriteriaQuery() {
-        return new JpaCriteriaQueryCreator(projections, getCriteriaBuilder(), 
entity, detachedCriteria).createQuery();
+        return new JpaCriteriaQueryCreator(projections, getCriteriaBuilder(), 
entity, detachedCriteria, predicateGenerator).createQuery();
     }
 
     public void setFetchSize(Integer fetchSize) {
@@ -654,6 +656,7 @@ public class HibernateQuery extends Query {
                 hibernateQuery.offset(this.offset);
             }
             hibernateQuery.setDetachedCriteria(this.detachedCriteria.clone());
+            hibernateQuery.predicateGenerator = this.predicateGenerator;
             return hibernateQuery;
         });
     }
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
index 8b06c93a09..c6ca7d0fc8 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
@@ -21,17 +21,20 @@ public class JpaCriteriaQueryCreator {
     private final HibernateCriteriaBuilder criteriaBuilder;
     private final PersistentEntity entity;
     private final DetachedCriteria detachedCriteria;
+    private final PredicateGenerator predicateGenerator;
 
     public JpaCriteriaQueryCreator(
             Query.ProjectionList projections
             , HibernateCriteriaBuilder criteriaBuilder
             , PersistentEntity entity
             , DetachedCriteria detachedCriteria
+            , PredicateGenerator predicateGenerator
     ) {
         this.projections = projections;
         this.criteriaBuilder = criteriaBuilder;
         this.entity = entity;
         this.detachedCriteria = detachedCriteria;
+        this.predicateGenerator = predicateGenerator;
     }
 
     public JpaCriteriaQuery<?> createQuery() {
@@ -132,7 +135,7 @@ public class JpaCriteriaQueryCreator {
     private void assignCriteria(CriteriaQuery cq , From root, JpaFromProvider 
tablesByName, PersistentEntity entity) {
         List<Query.Criterion>  criteriaList =detachedCriteria.getCriteria();
         if (!criteriaList.isEmpty()) {
-            jakarta.persistence.criteria.Predicate[] predicates = 
PredicateGenerator.getPredicates(criteriaBuilder, cq, root, criteriaList, 
tablesByName,entity);
+            jakarta.persistence.criteria.Predicate[] predicates = 
predicateGenerator.getPredicates(criteriaBuilder, cq, root, criteriaList, 
tablesByName,entity);
             cq.where(criteriaBuilder.and(predicates));
         }
     }
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
index 08de63641b..7e11030368 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
@@ -46,7 +46,7 @@ import java.util.stream.Stream;
 public class PredicateGenerator {
     private static final Logger log = 
LoggerFactory.getLogger(PredicateGenerator.class);
 
-    public static Predicate[] getPredicates(HibernateCriteriaBuilder cb,
+    public Predicate[] getPredicates(HibernateCriteriaBuilder cb,
                                             CriteriaQuery criteriaQuery,
                                             From root_,
                                             List<Query.Criterion> 
criteriaList, JpaFromProvider fromsByProvider, PersistentEntity entity) {
@@ -56,7 +56,7 @@ public class PredicateGenerator {
                 map(criterion -> {
                     if (criterion instanceof Query.Junction junction) {
                         var criterionList = junction.getCriteria();
-                        var predicates = getPredicates(cb, criteriaQuery, 
root_, criterionList, fromsByProvider, entity);
+                        var predicates = this.getPredicates(cb, criteriaQuery, 
root_, criterionList, fromsByProvider, entity);
                         if (junction instanceof Query.Disjunction) {
                             return cb.or(predicates);
                         } else if (junction instanceof Query.Conjunction) {
@@ -76,7 +76,7 @@ public class PredicateGenerator {
                         List<Query.Criterion> criterionList = c.getCriteria();
                         JpaFromProvider childTablesByName = (JpaFromProvider) 
fromsByProvider.clone();
                         childTablesByName.put("root", child);
-                        return cb.and(getPredicates(cb, criteriaQuery, child, 
criterionList, childTablesByName, entity));
+                        return cb.and(this.getPredicates(cb, criteriaQuery, 
child, criterionList, childTablesByName, entity));
                     } else if (criterion instanceof Query.PropertyCriterion 
pc) {
                         var fullyQualifiedPath = 
fromsByProvider.getFullyQualifiedPath(pc.getProperty());
                         if (criterion instanceof Query.Equals c) {
@@ -152,7 +152,7 @@ public class PredicateGenerator {
                                 Query.PropertyProjection projection = 
(Query.PropertyProjection) c.getSubquery().getProjections().get(0);
                                 boolean distinct = projection instanceof 
Query.DistinctPropertyProjection;
                                 JpaFromProvider newMap2 = (JpaFromProvider) 
fromsByProvider.clone();
-                                Predicate[] predicates2 = getPredicates(cb, 
criteriaQuery, from2, subCriteria2, newMap2, entity);
+                                Predicate[] predicates2 = 
this.getPredicates(cb, criteriaQuery, from2, subCriteria2, newMap2, entity);
                                 
subquery2.select(from2.get(projection.getPropertyName())).distinct(distinct).where(cb.and(predicates2));
                                 return 
cb.not(cb.in(fullyQualifiedPath).value(subquery2));
                             } else if ( Objects.nonNull(c.getSubquery())
@@ -163,7 +163,7 @@ public class PredicateGenerator {
                                 Root from2 = 
subquery2.from(c.getValue().getPersistentEntity().getJavaClass());
                                 List subCriteria2 = c.getValue().getCriteria();
                                 JpaFromProvider newMap2 = (JpaFromProvider) 
fromsByProvider.clone();
-                                Predicate[] predicates2 = getPredicates(cb, 
criteriaQuery, from2, subCriteria2, newMap2, entity);
+                                Predicate[] predicates2 = 
this.getPredicates(cb, criteriaQuery, from2, subCriteria2, newMap2, entity);
                                 
subquery2.select(from2).where(cb.and(predicates2));
                                 return 
cb.not(cb.in(root_.get("id")).value(subquery2));
                             } else {
@@ -176,7 +176,7 @@ public class PredicateGenerator {
                             List subCriteria = c.getValue().getCriteria();
                             JpaFromProvider newMap = (JpaFromProvider) 
fromsByProvider.clone();
                             newMap.put("root", from);
-                            Predicate[] predicates = getPredicates(cb, 
criteriaQuery, from, subCriteria, newMap, entity);
+                            Predicate[] predicates = this.getPredicates(cb, 
criteriaQuery, from, subCriteria, newMap, entity);
                             if (c instanceof Query.GreaterThanEqualsAll sc) {
                                 
subquery.select(cb.max(from.get(c.getProperty()))).where(cb.and(predicates));
                                 return 
cb.greaterThanOrEqualTo(fromsByProvider.getFullyQualifiedPath(sc.getProperty()),
 subquery);
@@ -236,7 +236,7 @@ public class PredicateGenerator {
 
                         JpaFromProvider newMap = (JpaFromProvider) 
fromsByProvider.clone();
                         newMap.put("root", subRoot);
-                        var predicates = getPredicates(cb, criteriaQuery, 
subRoot, c.getSubquery().getCriteria(), newMap, entity);
+                        var predicates = this.getPredicates(cb, criteriaQuery, 
subRoot, c.getSubquery().getCriteria(), newMap, entity);
 
                         var existsPredicate = getExistsPredicate(cb, root_, 
childPersistentEntity, subRoot);
                         Predicate[] allPredicates = Stream.concat(
@@ -255,7 +255,7 @@ public class PredicateGenerator {
 
                         JpaFromProvider newMap = (JpaFromProvider) 
fromsByProvider.clone();
                         newMap.put("root", subRoot);
-                        var predicates = getPredicates(cb, criteriaQuery, 
subRoot, c.getSubquery().getCriteria(), newMap, entity);
+                        var predicates = this.getPredicates(cb, criteriaQuery, 
subRoot, c.getSubquery().getCriteria(), newMap, entity);
 
                         var existsPredicate = getExistsPredicate(cb, root_, 
childPersistentEntity, subRoot);
                         Predicate[] allPredicates = Stream.concat(
@@ -275,7 +275,7 @@ public class PredicateGenerator {
         return list.toArray(new Predicate[0]);
     }
 
-    private static CriteriaBuilder.In 
getQueryableCriteriaValue(HibernateCriteriaBuilder cb, CriteriaQuery 
criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, 
Query.PropertyNameCriterion criterion, QueryableCriteria queryableCriteria) {
+    private CriteriaBuilder.In 
getQueryableCriteriaValue(HibernateCriteriaBuilder cb, CriteriaQuery 
criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, 
Query.PropertyNameCriterion criterion, QueryableCriteria queryableCriteria) {
         var projection = findPropertyOrIdProjection(queryableCriteria);
         var subProperty = findSubproperty(projection);
         var path = getPathFromInCriterion(fromsByProvider, criterion);
@@ -285,7 +285,7 @@ public class PredicateGenerator {
         var subCriteria = queryableCriteria.getCriteria();
         var clonedProviderByName = (JpaFromProvider) fromsByProvider.clone();
         clonedProviderByName.put("root", from);
-        var predicates = getPredicates(cb, criteriaQuery, from, subCriteria, 
clonedProviderByName, entity);
+        var predicates = this.getPredicates(cb, criteriaQuery, from, 
subCriteria, clonedProviderByName, entity);
         
subquery.select(clonedProviderByName.getFullyQualifiedPath(subProperty))
                 .distinct(true)
                 .where(cb.and(predicates));
@@ -293,7 +293,7 @@ public class PredicateGenerator {
         return value;
     }
 
-    private static Predicate getExistsPredicate(HibernateCriteriaBuilder cb, 
From root_, PersistentEntity childPersistentEntity, Root subRoot) {
+    private Predicate getExistsPredicate(HibernateCriteriaBuilder cb, From 
root_, PersistentEntity childPersistentEntity, Root subRoot) {
         Association owner = childPersistentEntity
                 .getAssociations()
                 .stream()
@@ -304,16 +304,16 @@ public class PredicateGenerator {
     }
 
     @SuppressWarnings("rawtypes")
-    private static JpaInPredicate findInPredicate(HibernateCriteriaBuilder cb, 
Object projection, Path path, String subProperty) {
+    private 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) {
+    private String findSubproperty(Object projection) {
         return projection instanceof Query.PropertyProjection ? 
((Query.PropertyProjection) projection).getPropertyName() :"id" ;
     }
 
     @SuppressWarnings("unchecked")
-    private static Query.Projection 
findPropertyOrIdProjection(QueryableCriteria queryableCriteria) {
+    private Query.Projection findPropertyOrIdProjection(QueryableCriteria 
queryableCriteria) {
         return (Query.Projection ) queryableCriteria.getProjections()
                 .stream().
                 filter(projection1 -> projection1 instanceof 
Query.PropertyProjection || projection1 instanceof Query.IdProjection)
@@ -322,25 +322,25 @@ public class PredicateGenerator {
     }
 
     @SuppressWarnings("rawtypes")
-    private static QueryableCriteria 
getQueryableCriteriaFromInCriteria(Query.Criterion criterion) {
+    private 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) {
+    private Path getPathFromInCriterion(JpaFromProvider tablesByName, 
Query.PropertyNameCriterion criterion) {
         return tablesByName.getFullyQualifiedPath(criterion.getProperty());
     }
 
 
     @SuppressWarnings("rawtypes")
-    private static Class getJavaTypeOfInClause(SqmInListPredicate predicate) {
+    private Class getJavaTypeOfInClause(SqmInListPredicate predicate) {
         return Optional.ofNullable(predicate.getTestExpression()
                 .getExpressible())
                 .map(expressible ->  
expressible.getExpressibleJavaType().getJavaTypeClass())
                 .orElse(null);
     }
 
-    private static Number getNumericValue(Query.PropertyCriterion criterion) {
+    private Number getNumericValue(Query.PropertyCriterion criterion) {
         Object value = criterion.getValue();
         if (value instanceof Number) {
             return (Number) value;

Reply via email to