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 797d9e5cbb8e914c4b6710240f4f0205c8cfacb0 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Fri Feb 20 13:21:41 2026 -0600 Parameterize JpaFromProvider return type and fix PredicateGenerator casts --- .../orm/hibernate/query/JpaFromProvider.java | 4 +- .../orm/hibernate/query/PredicateGenerator.java | 55 ++++++++++++---------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java index 6ade44807b..b3682eead9 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java @@ -21,7 +21,7 @@ import java.util.stream.Stream; public class JpaFromProvider implements Cloneable { - private Map<String, From<?, ?>> fromMap; + private final Map<String, From<?, ?>> fromMap; private JpaFromProvider(Map<String, From<?, ?>> fromMap) { this.fromMap = new HashMap<>(fromMap); @@ -99,7 +99,7 @@ public class JpaFromProvider implements Cloneable { )); } - public Path getFullyQualifiedPath(String propertyName) { + public Path<?> getFullyQualifiedPath(String propertyName) { if (Objects.isNull(propertyName) || propertyName.trim().isEmpty()) { throw new IllegalArgumentException("propertyName cannot be null"); } 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 f51fb781ce..aa810ba2dd 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 @@ -4,6 +4,7 @@ import groovy.util.logging.Slf4j; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.From; +import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.JoinType; import jakarta.persistence.criteria.Path; @@ -35,17 +36,19 @@ import java.util.Optional; import java.util.stream.Stream; @Slf4j +@SuppressWarnings({"unchecked", "rawtypes"}) public class PredicateGenerator { private static final Logger log = LoggerFactory.getLogger(PredicateGenerator.class); public Predicate[] getPredicates(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, - List criteriaList, + List<Query.Criterion> criteriaList, JpaFromProvider fromsByProvider, PersistentEntity entity) { - List<Predicate> list = ((List<Object>) criteriaList).stream() + List<Predicate> list = criteriaList + .stream() .map(criterion -> handleCriterion(cb, criteriaQuery, root_, fromsByProvider, entity, criterion)) .filter(Objects::nonNull) .toList(); @@ -56,23 +59,23 @@ public class PredicateGenerator { return list.toArray(new Predicate[0]); } - private Predicate handleCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Object criterion) { + private Predicate handleCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Criterion criterion) { if (criterion instanceof Query.Junction junction) { - return handleJunction(cb, criteriaQuery, root_, fromsByProvider, entity, junction); + return handleJunction(cb, criteriaQuery, root, fromsByProvider, entity, junction); } else if (criterion instanceof Query.DistinctProjection) { return cb.conjunction(); } else if (criterion instanceof DetachedAssociationCriteria<?> c) { - return handleAssociationCriteria(cb, criteriaQuery, root_, fromsByProvider, entity, c); + return handleAssociationCriteria(cb, criteriaQuery, root, fromsByProvider, entity, c); } else if (criterion instanceof Query.PropertyCriterion pc) { - return handlePropertyCriterion(cb, criteriaQuery, root_, fromsByProvider, entity, pc); + return handlePropertyCriterion(cb, criteriaQuery, root, fromsByProvider, entity, pc); } else if (criterion instanceof Query.PropertyComparisonCriterion c) { - return handlePropertyComparisonCriterion(cb, fromsByProvider, root_, c); + return handlePropertyComparisonCriterion(cb, fromsByProvider, root, c); } else if (criterion instanceof Query.PropertyNameCriterion c) { return handlePropertyNameCriterion(cb, fromsByProvider, c); } else if (criterion instanceof Query.Exists c) { - return handleExists(cb, criteriaQuery, root_, fromsByProvider, entity, c); + return handleExists(cb, criteriaQuery, root, fromsByProvider, entity, c); } else if (criterion instanceof Query.NotExists c) { - return cb.not(handleExists(cb, criteriaQuery, root_, fromsByProvider, entity, new Query.Exists(c.getSubquery()))); + return cb.not(handleExists(cb, criteriaQuery, root, fromsByProvider, entity, new Query.Exists(c.getSubquery()))); } throw new IllegalArgumentException("Unsupported criterion: " + criterion); } @@ -93,14 +96,14 @@ public class PredicateGenerator { return null; } - private Predicate handleAssociationCriteria(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, DetachedAssociationCriteria<?> c) { - Join child = root_.join(c.getAssociationPath(), JoinType.LEFT); + private Predicate handleAssociationCriteria(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root, JpaFromProvider fromsByProvider, PersistentEntity entity, DetachedAssociationCriteria<?> c) { + var child = root.join(c.getAssociationPath(), JoinType.LEFT); JpaFromProvider childTablesByName = (JpaFromProvider) fromsByProvider.clone(); childTablesByName.put("root", child); return cb.and(getPredicates(cb, criteriaQuery, child, c.getCriteria(), childTablesByName, entity)); } - private Predicate handlePropertyCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.PropertyCriterion pc) { + private Predicate handlePropertyCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.PropertyCriterion pc) { var fullyQualifiedPath = fromsByProvider.getFullyQualifiedPath(pc.getProperty()); if (pc instanceof Query.NotIn c) { @@ -110,39 +113,39 @@ public class PredicateGenerator { } else if (pc instanceof Query.In c) { return handleIn(cb, criteriaQuery, fromsByProvider, entity, c, fullyQualifiedPath); } else if (pc instanceof Query.ILike c) { - return cb.ilike(fullyQualifiedPath, c.getValue().toString()); + return cb.ilike((Expression<String>) fullyQualifiedPath, c.getValue().toString()); } else if (pc instanceof Query.RLike c) { return handleRLike(cb, fullyQualifiedPath, c); } else if (pc instanceof Query.Like c) { - return cb.like(fullyQualifiedPath, c.getValue().toString()); + return cb.like((Expression<String>) fullyQualifiedPath, c.getValue().toString()); } else if (pc instanceof Query.Equals c) { return cb.equal(fullyQualifiedPath, c.getValue()); } else if (pc instanceof Query.NotEquals c) { return cb.or(cb.notEqual(fullyQualifiedPath, c.getValue()), cb.isNull(fullyQualifiedPath)); } else if (pc instanceof Query.IdEquals c) { - return cb.equal(root_.get("id"), c.getValue()); + return cb.equal(root.get("id"), c.getValue()); } else if (pc instanceof Query.GreaterThan c) { - return cb.gt(fullyQualifiedPath, getNumericValue(c)); + return cb.gt((Expression<? extends Number>) fullyQualifiedPath, getNumericValue(c)); } else if (pc instanceof Query.GreaterThanEquals c) { - return cb.ge(fullyQualifiedPath, getNumericValue(c)); + return cb.ge((Expression<? extends Number>) fullyQualifiedPath, getNumericValue(c)); } else if (pc instanceof Query.LessThan c) { - return cb.lt(fullyQualifiedPath, getNumericValue(c)); + return cb.lt((Expression<? extends Number>) fullyQualifiedPath, getNumericValue(c)); } else if (pc instanceof Query.LessThanEquals c) { - return cb.le(fullyQualifiedPath, getNumericValue(c)); + return cb.le((Expression<? extends Number>) fullyQualifiedPath, getNumericValue(c)); } else if (pc instanceof Query.SizeEquals c) { - return cb.equal(cb.size(fullyQualifiedPath), c.getValue()); + return cb.equal(cb.size((Expression) fullyQualifiedPath), c.getValue()); } else if (pc instanceof Query.SizeNotEquals c) { - return cb.notEqual(cb.size(fullyQualifiedPath), c.getValue()); + return cb.notEqual(cb.size((Expression) fullyQualifiedPath), c.getValue()); } else if (pc instanceof Query.SizeGreaterThan c) { - return cb.gt(cb.size(fullyQualifiedPath), getNumericValue(c)); + return cb.gt(cb.size((Expression) fullyQualifiedPath), getNumericValue(c)); } else if (pc instanceof Query.SizeGreaterThanEquals c) { - return cb.ge(cb.size(fullyQualifiedPath), getNumericValue(c)); + return cb.ge(cb.size((Expression) fullyQualifiedPath), getNumericValue(c)); } else if (pc instanceof Query.SizeLessThan c) { - return cb.lt(cb.size(fullyQualifiedPath), getNumericValue(c)); + return cb.lt(cb.size((Expression) fullyQualifiedPath), getNumericValue(c)); } else if (pc instanceof Query.SizeLessThanEquals c) { - return cb.le(cb.size(fullyQualifiedPath), getNumericValue(c)); + return cb.le(cb.size((Expression) fullyQualifiedPath), getNumericValue(c)); } else if (pc instanceof Query.Between c) { - return cb.between(fullyQualifiedPath, (Comparable) c.getFrom(), (Comparable) c.getTo()); + return cb.between((Expression) fullyQualifiedPath, (Comparable) c.getFrom(), (Comparable) c.getTo()); } return null; }
