This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 67b42acfbafc1e6e737ce8773a6320fe75c2ca06 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Wed Mar 4 10:28:57 2026 -0600 clean up PredicateGenerator --- .../orm/hibernate/query/PredicateGenerator.java | 24 ++++++++++------------ .../JpaCriteriaQueryCreatorSpec.groovy | 1 - 2 files changed, 11 insertions(+), 14 deletions(-) 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 2b19c9fd45..8488ef23d1 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,7 +39,6 @@ import org.grails.datastore.gorm.GormEntity; import org.grails.datastore.gorm.query.criteria.DetachedAssociationCriteria; import org.grails.datastore.mapping.core.exceptions.ConfigurationException; import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.QueryableCriteria; import org.hibernate.query.criteria.HibernateCriteriaBuilder; @@ -53,7 +52,13 @@ import org.slf4j.LoggerFactory; @SuppressWarnings({ "PMD.DataflowAnomalyAnalysis", "PMD.AvoidLiteralsInIfCondition", - "PMD.AvoidDuplicateLiterals" + "PMD.AvoidDuplicateLiterals", + // GORM stores criterion values as Object; JPA expects types resolved at compile time. + // The unchecked casts here are deliberate — type safety is enforced at runtime by + // MappingContext, not at compile time. This is the inherent cost of bridging a + // runtime-typed DSL (GORM) to a compile-time-typed API (JPA Criteria). + "unchecked", + "rawtypes" }) public class PredicateGenerator { private static final Logger log = LoggerFactory.getLogger(PredicateGenerator.class); @@ -94,11 +99,11 @@ public class PredicateGenerator { } else if (criterion instanceof DetachedAssociationCriteria<?> c) { return handleAssociationCriteria(cb, criteriaQuery, root, fromsByProvider, entity, c); } else if (criterion instanceof HibernateAssociationQuery haq) { - return handleHibernateAssociationQuery(cb, criteriaQuery, root, fromsByProvider, entity, haq); + return handleHibernateAssociationQuery(cb, criteriaQuery, root, fromsByProvider, haq); } else if (criterion instanceof Query.PropertyCriterion 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, c); } else if (criterion instanceof Query.PropertyNameCriterion c) { return handlePropertyNameCriterion(cb, fromsByProvider, c); } else if (criterion instanceof Query.Exists c) { @@ -153,7 +158,6 @@ public class PredicateGenerator { CriteriaQuery<?> criteriaQuery, From<?, ?> root, JpaFromProvider fromsByProvider, - PersistentEntity entity, HibernateAssociationQuery haq) { var child = root.join(haq.associationPath, JoinType.LEFT); JpaFromProvider childFroms = (JpaFromProvider) fromsByProvider.clone(); @@ -265,10 +269,9 @@ public class PredicateGenerator { return getQueryableCriteriaValue( cb, criteriaQuery, fromsByProvider, entity, c, queryableCriteria); } else if (!c.getValues().isEmpty()) { - boolean areGormEntities = c.getValues().stream().allMatch(GormEntity.class::isInstance); - if (areGormEntities) { + if (c.getValues().iterator().next() instanceof GormEntity firstEntity) { List<GormEntity> gormEntities = new ArrayList<>(c.getValues()); - Path id = criteriaQuery.from(gormEntities.get(0).getClass()).get("id"); + Path id = criteriaQuery.from(firstEntity.getClass()).get("id"); Collection newValues = gormEntities.stream().map(GormEntity::ident).toList(); return cb.in(id, newValues); } @@ -337,7 +340,6 @@ public class PredicateGenerator { private Predicate handlePropertyComparisonCriterion( HibernateCriteriaBuilder cb, JpaFromProvider fromsByProvider, - From<?, ?> root_, Query.PropertyComparisonCriterion c) { Path path = fromsByProvider.getFullyQualifiedPath(c.getProperty()); Path otherPath = fromsByProvider.getFullyQualifiedPath(c.getOtherProperty()); @@ -434,7 +436,6 @@ public class PredicateGenerator { .orElse(null); } - @SuppressWarnings("rawtypes") private JpaInPredicate findInPredicate( HibernateCriteriaBuilder cb, Object projection, Path path, String subProperty) { return projection instanceof Query.PropertyProjection @@ -448,7 +449,6 @@ public class PredicateGenerator { : "id"; } - @SuppressWarnings("unchecked") private Query.Projection findPropertyOrIdProjection(QueryableCriteria queryableCriteria) { return (Query.Projection) queryableCriteria.getProjections().stream() @@ -457,14 +457,12 @@ public class PredicateGenerator { .orElse(new Query.IdProjection()); } - @SuppressWarnings("rawtypes") private QueryableCriteria getQueryableCriteriaFromInCriteria(Query.Criterion criterion) { return criterion instanceof Query.In ? ((Query.In) criterion).getSubquery() : ((Query.NotIn) criterion).getSubquery(); } - @SuppressWarnings("rawtypes") private Class getJavaTypeOfInClause(SqmInListPredicate predicate) { return Optional.ofNullable(predicate.getTestExpression().getExpressible()) .map(expressible -> expressible.getExpressibleJavaType().getJavaTypeClass()) diff --git a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy index 8ad54c2c23..968e78f914 100644 --- a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy @@ -5,7 +5,6 @@ import grails.gorm.specs.HibernateGormDatastoreSpec import org.apache.grails.data.testing.tck.domains.Person import org.grails.datastore.mapping.query.Query import org.grails.orm.hibernate.query.JpaCriteriaQueryCreator -import org.grails.orm.hibernate.query.PredicateGenerator import org.hibernate.query.criteria.HibernateCriteriaBuilder import org.hibernate.query.criteria.JpaCriteriaQuery
