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 1e02d36a681576e0f9b1c1a355bbccae53ef9feb Author: Walter Duque de Estrada <[email protected]> AuthorDate: Fri Feb 20 11:28:54 2026 -0600 Resolve raw type warnings and parameterized criteria query logic --- .../grails/orm/hibernate/query/HibernateQuery.java | 8 +-- .../hibernate/query/JpaCriteriaQueryCreator.java | 79 +++++++++++----------- .../orm/hibernate/query/JpaFromProvider.java | 16 ++--- .../orm/hibernate/query/PredicateGenerator.java | 26 +++---- 4 files changed, 63 insertions(+), 66 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 53605fa7a5..fafeb88b7e 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 @@ -55,14 +55,14 @@ public class HibernateQuery extends Query { protected static final String ALIAS = "_alias"; protected String alias; protected int aliasCount; - public DetachedCriteria getDetachedCriteria() { + public DetachedCriteria<?> getDetachedCriteria() { return detachedCriteria; } protected Map<String, CriteriaAndAlias> createdAssociationPaths = new HashMap<>(); protected LinkedList<String> aliasStack = new LinkedList<>(); protected LinkedList<PersistentEntity> entityStack = new LinkedList<PersistentEntity>(); protected LinkedList<Association> associationStack = new LinkedList<Association>(); - protected DetachedCriteria detachedCriteria; + protected DetachedCriteria<?> detachedCriteria; protected ProxyHandler proxyHandler = new HibernateProxyHandler(); private Integer fetchSize; @@ -76,7 +76,7 @@ public class HibernateQuery extends Query { } - public void setDetachedCriteria(DetachedCriteria detachedCriteria) { + public void setDetachedCriteria(DetachedCriteria<?> detachedCriteria) { this.detachedCriteria = detachedCriteria; } @@ -470,7 +470,7 @@ public class HibernateQuery extends Query { - public DetachedCriteria getHibernateCriteria() { + public DetachedCriteria<?> getHibernateCriteria() { return detachedCriteria; } 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 e31645ea53..6162991cf4 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 @@ -5,6 +5,10 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.From; import jakarta.persistence.criteria.Path; +import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.Selection; +import jakarta.persistence.criteria.Order; +import jakarta.persistence.criteria.Predicate; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.query.Query; import org.hibernate.query.criteria.HibernateCriteriaBuilder; @@ -15,19 +19,20 @@ import java.util.List; import java.util.Objects; import java.util.function.Function; +@SuppressWarnings({"unchecked", "rawtypes"}) public class JpaCriteriaQueryCreator { private final Query.ProjectionList projections; private final HibernateCriteriaBuilder criteriaBuilder; private final PersistentEntity entity; - private final DetachedCriteria detachedCriteria; + private final DetachedCriteria<?> detachedCriteria; public JpaCriteriaQueryCreator( Query.ProjectionList projections , HibernateCriteriaBuilder criteriaBuilder , PersistentEntity entity - , DetachedCriteria detachedCriteria + , DetachedCriteria<?> detachedCriteria ) { this.projections = projections; this.criteriaBuilder = criteriaBuilder; @@ -39,7 +44,7 @@ public class JpaCriteriaQueryCreator { var projectionList = collectProjections(); var cq = createCriteriaQuery(projectionList); - var root = cq.from(entity.getJavaClass()); + Root<?> root = cq.from(entity.getJavaClass()); var tablesByName = new JpaFromProvider(detachedCriteria,cq,root); @@ -73,72 +78,65 @@ public class JpaCriteriaQueryCreator { return cq; } - private void assignProjections(List<Query.Projection> projections, CriteriaQuery cq, JpaFromProvider tablesByName) { - var projectionExpressions = projections + private <T> void assignProjections(List<Query.Projection> projections, CriteriaQuery<T> cq, JpaFromProvider tablesByName) { + List<Selection<?>> projectionExpressions = (List) projections .stream() .map(projectionToJpaExpression(tablesByName)) .filter(Objects::nonNull) - .map(Expression.class::cast) .toList(); if (projectionExpressions.size() == 1) { - cq.select(projectionExpressions.get(0)); + cq.select((Selection<? extends T>) projectionExpressions.get(0)); } else if (projectionExpressions.size() > 1){ cq.multiselect(projectionExpressions); } else { - cq.select(tablesByName.getFullyQualifiedPath("root")); + cq.select((Selection<? extends T>) tablesByName.getFullyQualifiedPath("root")); } } - private void assignGroupBy(List<Query.GroupPropertyProjection> groupProjections, From root, CriteriaQuery cq, JpaFromProvider tablesByName) { + private void assignGroupBy(List<Query.GroupPropertyProjection> groupProjections, From<?, ?> root, CriteriaQuery<?> cq, JpaFromProvider tablesByName) { if (!groupProjections.isEmpty()) { - List<Expression> groupByPaths = groupProjections + List<Expression<?>> groupByPaths = (List) groupProjections .stream() .map(groupPropertyProjection -> { String propertyName = groupPropertyProjection.getPropertyName(); return tablesByName.getFullyQualifiedPath(propertyName); }) - .map(Expression.class::cast) + .filter(Objects::nonNull) .toList(); cq.groupBy(groupByPaths); } } - private void assignOrderBy(CriteriaQuery cq, JpaFromProvider tablesByName) { + private void assignOrderBy(CriteriaQuery<?> cq, JpaFromProvider tablesByName) { List<Query.Order> orders = detachedCriteria.getOrders(); if (!orders.isEmpty()) { - cq.orderBy(orders - .stream() + List<Order> jpaOrders = (List) orders.stream() .map(order -> { - Path expression = tablesByName.getFullyQualifiedPath(order.getProperty()); + Path<?> expression = tablesByName.getFullyQualifiedPath(order.getProperty()); if (order.isIgnoreCase() && expression.getJavaType().equals(String.class)) { - if (order.getDirection().equals(Query.Order.Direction.ASC)) { - return criteriaBuilder.asc(criteriaBuilder.lower(expression)); - } else { - return criteriaBuilder.desc(criteriaBuilder.lower(expression)); - } + return order.getDirection().equals(Query.Order.Direction.ASC) + ? criteriaBuilder.asc(criteriaBuilder.lower((Expression<String>) expression)) + : criteriaBuilder.desc(criteriaBuilder.lower((Expression<String>) expression)); } else { - if (order.getDirection().equals(Query.Order.Direction.ASC)) { - return criteriaBuilder.asc(expression); - } else { - return criteriaBuilder.desc(expression); - } + return order.getDirection().equals(Query.Order.Direction.ASC) + ? criteriaBuilder.asc(expression) + : criteriaBuilder.desc(expression); } - }) - .toList() - ); + .toList(); + cq.orderBy(jpaOrders); } } - private void assignCriteria(CriteriaQuery cq , From root, JpaFromProvider tablesByName, PersistentEntity entity) { - List<Query.Criterion> criteriaList =detachedCriteria.getCriteria(); + 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 = new PredicateGenerator().getPredicates(criteriaBuilder, cq, root, criteriaList, tablesByName,entity); + Predicate[] predicates = new PredicateGenerator().getPredicates(criteriaBuilder, cq, root, criteriaList, tablesByName, entity); cq.where(criteriaBuilder.and(predicates)); } } - private Function<Query.Projection, JpaExpression> projectionToJpaExpression( + private Function<Query.Projection, JpaExpression<?>> projectionToJpaExpression( JpaFromProvider tablesByName) { return projection -> { if (projection instanceof Query.CountProjection) { @@ -147,34 +145,33 @@ public class JpaCriteriaQueryCreator { var propertyName = countDistinctProjection.getPropertyName(); return criteriaBuilder.countDistinct(tablesByName.getFullyQualifiedPath("root." + propertyName)); } else if (projection instanceof Query.IdProjection) { - return (JpaExpression) tablesByName.getFullyQualifiedPath("root.id"); + return (JpaExpression<?>) tablesByName.getFullyQualifiedPath("root.id"); } else if (projection instanceof Query.DistinctProjection) { return null; } else { var propertyName = ((Query.PropertyProjection) projection).getPropertyName(); - Path path = tablesByName.getFullyQualifiedPath(propertyName); + Path<?> path = tablesByName.getFullyQualifiedPath(propertyName); if (projection instanceof Query.MaxProjection) { - return criteriaBuilder.max(path); + return criteriaBuilder.max((Expression<? extends Number>)path); } else if (projection instanceof Query.MinProjection) { - return criteriaBuilder.min(path); + return criteriaBuilder.min((Expression<? extends Number>)path); } else if (projection instanceof Query.AvgProjection) { - return criteriaBuilder.avg(path); + return criteriaBuilder.avg((Expression<? extends Number>)path); } else if (projection instanceof Query.SumProjection) { - return criteriaBuilder.sum(path); + return criteriaBuilder.sum((Expression<? extends Number>)path); } else { // keep this last!!! - return (JpaExpression)path; + return (JpaExpression<?>)path; } } }; } private List<Query.GroupPropertyProjection> collectGroupProjections() { - List<Query.GroupPropertyProjection> groupProjections = projections.getProjectionList() + return projections.getProjectionList() .stream() .filter(Query.GroupPropertyProjection.class::isInstance) .map(Query.GroupPropertyProjection.class::cast) .toList(); - return groupProjections; } } 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 1f1b67c96e..6ade44807b 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,18 +21,18 @@ import java.util.stream.Stream; public class JpaFromProvider implements Cloneable { - private Map<String, From> fromMap; + private Map<String, From<?, ?>> fromMap; - private JpaFromProvider(Map<String, From> fromMap) { + private JpaFromProvider(Map<String, From<?, ?>> fromMap) { this.fromMap = new HashMap<>(fromMap); } - public JpaFromProvider(DetachedCriteria detachedCriteria, JpaCriteriaQuery<?> cq, From root) { + public JpaFromProvider(DetachedCriteria<?> detachedCriteria, JpaCriteriaQuery<?> cq, From<?, ?> root) { fromMap = getFromsByName(detachedCriteria, cq, root); } - private Map<String, From> getFromsByName(DetachedCriteria detachedCriteria, JpaCriteriaQuery<?> cq, From root) { + private Map<String, From<?, ?>> getFromsByName(DetachedCriteria<?> detachedCriteria, JpaCriteriaQuery<?> cq, From<?, ?> root) { var detachedAssociationCriteriaList = ((List<Query.Criterion>) detachedCriteria.getCriteria()) .stream() .map(new DetachedAssociationFunction()) @@ -42,7 +42,7 @@ public class JpaFromProvider implements Cloneable { var aliasMap = createAliasMap(detachedAssociationCriteriaList); //The join column is column for joining from the root entity var detachedFroms = createDetachedFroms(cq, detachedAssociationCriteriaList); - Map<String, From> fromsByName = Stream.concat(aliasMap.keySet().stream(), ((Map<String, FetchType>) detachedCriteria.getFetchStrategies()) + Map<String, From<?, ?>> fromsByName = Stream.concat(aliasMap.keySet().stream(), ((Map<String, FetchType>) detachedCriteria.getFetchStrategies()) .entrySet() .stream() .filter(entry -> entry.getValue().equals(FetchType.EAGER)) @@ -55,7 +55,7 @@ public class JpaFromProvider implements Cloneable { .map(dac -> dac.getAssociation().getOwner().getJavaClass()) .orElse(root.getJavaType()); // Choose base From: use outer root only if join belongs to the outer root type; otherwise create a detached root for the owner - From base = ownerClass.equals(root.getJavaType()) + From<?, ?> base = ownerClass.equals(root.getJavaType()) ? root : detachedFroms.computeIfAbsent(joinColumn, s -> cq.from(ownerClass)); @@ -77,7 +77,7 @@ public class JpaFromProvider implements Cloneable { return fromsByName; } - private Map<String, From> createDetachedFroms(JpaCriteriaQuery<?> cq, List<DetachedAssociationCriteria> detachedAssociationCriteriaList) { + private Map<String, From<?, ?>> createDetachedFroms(JpaCriteriaQuery<?> cq, List<DetachedAssociationCriteria> detachedAssociationCriteriaList) { return detachedAssociationCriteriaList.stream() .collect(Collectors.toMap( DetachedAssociationCriteria::getAssociationPath, @@ -121,7 +121,7 @@ public class JpaFromProvider implements Cloneable { } - public void put(String tableName, From child) { + public void put(String tableName, From<?, ?> child) { fromMap.put(tableName, child); } } 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 aafd7bccf9..f51fb781ce 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 @@ -39,8 +39,8 @@ public class PredicateGenerator { private static final Logger log = LoggerFactory.getLogger(PredicateGenerator.class); public Predicate[] getPredicates(HibernateCriteriaBuilder cb, - CriteriaQuery criteriaQuery, - From root_, + CriteriaQuery<?> criteriaQuery, + From<?, ?> root_, List criteriaList, JpaFromProvider fromsByProvider, PersistentEntity entity) { @@ -56,7 +56,7 @@ 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, Object criterion) { if (criterion instanceof Query.Junction junction) { return handleJunction(cb, criteriaQuery, root_, fromsByProvider, entity, junction); } else if (criterion instanceof Query.DistinctProjection) { @@ -77,7 +77,7 @@ public class PredicateGenerator { throw new IllegalArgumentException("Unsupported criterion: " + criterion); } - private Predicate handleJunction(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Junction junction) { + private Predicate handleJunction(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Junction junction) { var predicates = getPredicates(cb, criteriaQuery, root_, junction.getCriteria(), fromsByProvider, entity); if (junction instanceof Query.Disjunction) { return cb.or(predicates); @@ -93,14 +93,14 @@ public class PredicateGenerator { return null; } - private Predicate handleAssociationCriteria(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, DetachedAssociationCriteria<?> c) { + private Predicate handleAssociationCriteria(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, DetachedAssociationCriteria<?> c) { Join 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) { @@ -147,7 +147,7 @@ public class PredicateGenerator { return null; } - private Predicate handleNotIn(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.NotIn c, Path fullyQualifiedPath) { + private Predicate handleNotIn(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.NotIn c, Path fullyQualifiedPath) { var queryableCriteria = getQueryableCriteriaFromInCriteria(c); if (Objects.nonNull(queryableCriteria)) { return cb.not(getQueryableCriteriaValue(cb, criteriaQuery, fromsByProvider, entity, c, queryableCriteria)); @@ -170,7 +170,7 @@ public class PredicateGenerator { return cb.not(cb.in(fullyQualifiedPath, c.getValue())); } - private Predicate handleIn(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.In c, Path fullyQualifiedPath) { + private Predicate handleIn(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.In c, Path fullyQualifiedPath) { var queryableCriteria = getQueryableCriteriaFromInCriteria(c); if (Objects.nonNull(queryableCriteria)) { return getQueryableCriteriaValue(cb, criteriaQuery, fromsByProvider, entity, c, queryableCriteria); @@ -192,7 +192,7 @@ public class PredicateGenerator { return cb.equal(cb.function(GrailsRLikeFunctionContributor.RLIKE, Boolean.class, fullyQualifiedPath, cb.literal(pattern)), true); } - private Predicate handleSubqueryCriterion(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.SubqueryCriterion c) { + private Predicate handleSubqueryCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.SubqueryCriterion c) { Subquery subquery = criteriaQuery.subquery(Number.class); Root from = subquery.from(c.getValue().getPersistentEntity().getJavaClass()); JpaFromProvider newMap = (JpaFromProvider) fromsByProvider.clone(); @@ -231,7 +231,7 @@ public class PredicateGenerator { return null; } - private Predicate handlePropertyComparisonCriterion(HibernateCriteriaBuilder cb, JpaFromProvider fromsByProvider, From root_, Query.PropertyComparisonCriterion c) { + private Predicate handlePropertyComparisonCriterion(HibernateCriteriaBuilder cb, JpaFromProvider fromsByProvider, From<?, ?> root_, Query.PropertyComparisonCriterion c) { Path path = fromsByProvider.getFullyQualifiedPath(c.getProperty()); Path otherPath = root_.get(c.getOtherProperty()); if (c instanceof Query.EqualsProperty) return cb.equal(path, otherPath); @@ -252,7 +252,7 @@ public class PredicateGenerator { return null; } - private Predicate handleExists(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Exists c) { + private Predicate handleExists(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Exists c) { Subquery subquery = criteriaQuery.subquery(Integer.class); PersistentEntity childPersistentEntity = c.getSubquery().getPersistentEntity(); Root subRoot = subquery.from(childPersistentEntity.getJavaClass()); @@ -265,7 +265,7 @@ public class PredicateGenerator { return cb.exists(subquery); } - private 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 = fromsByProvider.getFullyQualifiedPath(criterion.getProperty()); @@ -279,7 +279,7 @@ public class PredicateGenerator { return in.value(subquery); } - private 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() .filter(assoc -> assoc.getAssociatedEntity().getJavaClass().equals(root_.getJavaType())) .findFirst().orElseThrow();
