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 bca227a42255c2cf273066b321a881eb3896d21d Author: Walter Duque de Estrada <[email protected]> AuthorDate: Thu Feb 26 18:33:22 2026 -0600 spotless apply --- .../groovy/grails/orm/CriteriaMethodInvoker.java | 23 ++++-- .../grails/orm/HibernateCriteriaBuilder.java | 29 ++++--- .../orm/hibernate/GrailsHibernateTemplate.java | 11 +-- .../hibernate/HibernatePersistentProperty.java | 16 ++-- .../hibernate/query/GrailsHibernateQueryUtils.java | 90 +++++++++++----------- .../grails/orm/hibernate/query/HibernateQuery.java | 3 +- 6 files changed, 95 insertions(+), 77 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/grails/orm/CriteriaMethodInvoker.java b/grails-data-hibernate7/core/src/main/groovy/grails/orm/CriteriaMethodInvoker.java index dfed974503..1ab0d4a48c 100644 --- a/grails-data-hibernate7/core/src/main/groovy/grails/orm/CriteriaMethodInvoker.java +++ b/grails-data-hibernate7/core/src/main/groovy/grails/orm/CriteriaMethodInvoker.java @@ -201,8 +201,9 @@ public class CriteriaMethodInvoker { return UNHANDLED; } - @SuppressWarnings("PMD.DataflowAnomalyAnalysis") - protected Object trySimpleCriteria(String name, CriteriaMethods method, Object[] args) { if (args.length != 1 || args[0] == null) { + @SuppressWarnings("PMD.DataflowAnomalyAnalysis") + protected Object trySimpleCriteria(String name, CriteriaMethods method, Object[] args) { + if (args.length != 1 || args[0] == null) { return UNHANDLED; } @@ -214,14 +215,22 @@ public class CriteriaMethodInvoker { if (!(args[0] instanceof String)) { builder.throwRuntimeException( new IllegalArgumentException( - "call to [" + name + "] with value [" + args[0] + "] requires a String value.")); + "call to [" + + name + + "] with value [" + + args[0] + + "] requires a String value.")); } final String value = (String) args[0]; switch (method) { - case IS_NULL -> builder.getHibernateQuery().isNull(builder.calculatePropertyName(value)); - case IS_NOT_NULL -> builder.getHibernateQuery().isNotNull(builder.calculatePropertyName(value)); - case IS_EMPTY -> builder.getHibernateQuery().isEmpty(builder.calculatePropertyName(value)); - case IS_NOT_EMPTY -> builder.getHibernateQuery().isNotEmpty(builder.calculatePropertyName(value)); + case IS_NULL -> + builder.getHibernateQuery().isNull(builder.calculatePropertyName(value)); + case IS_NOT_NULL -> + builder.getHibernateQuery().isNotNull(builder.calculatePropertyName(value)); + case IS_EMPTY -> + builder.getHibernateQuery().isEmpty(builder.calculatePropertyName(value)); + case IS_NOT_EMPTY -> + builder.getHibernateQuery().isNotEmpty(builder.calculatePropertyName(value)); } return name; } diff --git a/grails-data-hibernate7/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java b/grails-data-hibernate7/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java index 2cc6fee48d..ce45e5d4b9 100644 --- a/grails-data-hibernate7/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java +++ b/grails-data-hibernate7/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java @@ -53,12 +53,13 @@ import org.slf4j.LoggerFactory; import org.springframework.core.convert.ConversionService; /** - * Implements the GORM criteria DSL for Hibernate 7+. The builder exposes a Groovy-closure - * DSL that is translated into JPA Criteria queries via {@link HibernateQuery}. It is the - * backing implementation for the {@code createCriteria()} and {@code withCriteria()} dynamic - * static methods that GORM adds to every domain class. + * Implements the GORM criteria DSL for Hibernate 7+. The builder exposes a Groovy-closure DSL that + * is translated into JPA Criteria queries via {@link HibernateQuery}. It is the backing + * implementation for the {@code createCriteria()} and {@code withCriteria()} dynamic static methods + * that GORM adds to every domain class. * * <h2>DSL usage via domain class</h2> + * * <pre> * def c = Account.createCriteria() * def results = c.list { @@ -76,8 +77,9 @@ import org.springframework.core.convert.ConversionService; * </pre> * * <h2>Programmatic instantiation</h2> - * <p>The builder requires a {@link SessionFactory}, the target persistent class, and the - * {@link org.grails.orm.hibernate.AbstractHibernateDatastore} that owns the session: + * + * <p>The builder requires a {@link SessionFactory}, the target persistent class, and the {@link + * org.grails.orm.hibernate.AbstractHibernateDatastore} that owns the session: * * <pre> * new HibernateCriteriaBuilder(Account, sessionFactory, datastore).list { @@ -86,11 +88,11 @@ import org.springframework.core.convert.ConversionService; * </pre> * * <h2>Architecture</h2> - * <p>Closure method calls in the DSL are dispatched through - * {@code invokeMethod} → {@code CriteriaMethodInvoker} → {@link HibernateQuery}, which - * translates each GORM constraint into the equivalent JPA Criteria predicate. - * {@link grails.gorm.DetachedCriteria} can also be passed in place of a closure to support - * multi-tenant and reusable query fragments. + * + * <p>Closure method calls in the DSL are dispatched through {@code invokeMethod} → {@code + * CriteriaMethodInvoker} → {@link HibernateQuery}, which translates each GORM constraint into the + * equivalent JPA Criteria predicate. {@link grails.gorm.DetachedCriteria} can also be passed in + * place of a closure to support multi-tenant and reusable query fragments. * * @author Graeme Rocher * @author walterduquedeestrada @@ -113,10 +115,13 @@ public class HibernateCriteriaBuilder extends GroovyObjectSupport protected CriteriaQuery criteriaQuery; protected boolean uniqueResult = false; protected boolean participate; + @SuppressWarnings("PMD.AvoidFieldNameMatchingMethodName") protected boolean scroll; + @SuppressWarnings("PMD.AvoidFieldNameMatchingMethodName") protected boolean count; + protected List<String> aliasStack = new ArrayList<String>(); protected static final String ALIAS = "_alias"; protected boolean paginationEnabledList = false; @@ -128,8 +133,10 @@ public class HibernateCriteriaBuilder extends GroovyObjectSupport protected HibernateQuery hibernateQuery; private boolean shouldLock; private boolean shouldCache; + @SuppressWarnings("PMD.AvoidFieldNameMatchingMethodName") private boolean readOnly; + @SuppressWarnings("PMD.AvoidFieldNameMatchingMethodName") protected boolean distinct = false; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java index 7595a3628f..54bf894f8b 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java @@ -384,11 +384,12 @@ public class GrailsHibernateTemplate implements IHibernateTemplate { } else { sessionIfcs = new Class[] {mainIfc}; } - return (Session) - Proxy.newProxyInstance( - Thread.currentThread().getContextClassLoader(), - sessionIfcs, - new CloseSuppressingInvocationHandler(session)); } + return (Session) + Proxy.newProxyInstance( + Thread.currentThread().getContextClassLoader(), + sessionIfcs, + new CloseSuppressingInvocationHandler(session)); + } @Deprecated(since = "7.0", forRemoval = true) public <T> T get(final Class<T> entityClass, final Serializable id) throws DataAccessException { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java index 5ab4ae3dd2..62a5f25ca0 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java @@ -21,14 +21,13 @@ package org.grails.orm.hibernate.cfg.domainbinding.hibernate; import static java.util.Optional.ofNullable; import java.util.Optional; +import org.checkerframework.checker.nullness.qual.Nullable; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.Embedded; import org.grails.orm.hibernate.cfg.ColumnConfig; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PropertyConfig; - -import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.mapping.DependantValue; import org.hibernate.mapping.Property; import org.hibernate.mapping.SimpleValue; @@ -85,21 +84,18 @@ public interface HibernatePersistentProperty extends PersistentProperty<Property */ default String getTypeName(Class<?> propertyType, PropertyConfig config, Mapping mapping) { return ofNullable(config) - .map(PropertyConfig::getTypeName) - .orElseGet(() -> getMappingName(propertyType, mapping)); + .map(PropertyConfig::getTypeName) + .orElseGet(() -> getMappingName(propertyType, mapping)); } private static @Nullable String getMappingName(Class<?> propertyClass, Mapping mapping) { return ofNullable(mapping) - .map(__ -> __.getTypeName(propertyClass)) - .orElseGet(() -> getClassName(propertyClass)); + .map(__ -> __.getTypeName(propertyClass)) + .orElseGet(() -> getClassName(propertyClass)); } private static @Nullable String getClassName(Class<?> propertyClass) { - return ofNullable(propertyClass) - .filter(__ -> !__.isEnum()) - .map(Class::getName) - .orElse(null); + return ofNullable(propertyClass).filter(__ -> !__.isEnum()).map(Class::getName).orElse(null); } default GrailsHibernatePersistentEntity getHibernateOwner() { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java index f9712d1172..d0a342aba4 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java @@ -64,26 +64,27 @@ public class GrailsHibernateQueryUtils { Root queryRoot, CriteriaBuilder criteriaBuilder, Map argMap, - ConversionService conversionService, - boolean useDefaultMapping) { - Object fetchObj = argMap.get(DynamicFinder.ARGUMENT_FETCH); - if (fetchObj instanceof Map) { - Map fetch = (Map) fetchObj; - for (Object o : fetch.keySet()) { - String associationName = (String) o; - - final FetchMode fetchMode = getFetchMode(fetch.get(associationName)); - if (fetchMode == FetchMode.JOIN) { - queryRoot.join(associationName); - } - } - } - - final Object sortObj = argMap.get(DynamicFinder.ARGUMENT_SORT); - if (sortObj != null) { - final boolean ignoreCase = - !(argMap.get(DynamicFinder.ARGUMENT_IGNORE_CASE) instanceof Boolean b) || b; - if (sortObj instanceof Map) { Map sortMap = (Map) sortObj; + ConversionService conversionService, + boolean useDefaultMapping) { + Object fetchObj = argMap.get(DynamicFinder.ARGUMENT_FETCH); + if (fetchObj instanceof Map) { + Map fetch = (Map) fetchObj; + for (Object o : fetch.keySet()) { + String associationName = (String) o; + + final FetchMode fetchMode = getFetchMode(fetch.get(associationName)); + if (fetchMode == FetchMode.JOIN) { + queryRoot.join(associationName); + } + } + } + + final Object sortObj = argMap.get(DynamicFinder.ARGUMENT_SORT); + if (sortObj != null) { + final boolean ignoreCase = + !(argMap.get(DynamicFinder.ARGUMENT_IGNORE_CASE) instanceof Boolean b) || b; + if (sortObj instanceof Map) { + Map sortMap = (Map) sortObj; for (Object sort : sortMap.keySet()) { final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase((String) sortMap.get(sort)) @@ -92,14 +93,16 @@ public class GrailsHibernateQueryUtils { addOrderPossiblyNested( query, queryRoot, criteriaBuilder, entity, (String) sort, order, ignoreCase); } - } else { - final String sort = (String) sortObj; - final String order = - DynamicFinder.ORDER_DESC.equalsIgnoreCase((String) argMap.get(DynamicFinder.ARGUMENT_ORDER)) - ? DynamicFinder.ORDER_DESC - : DynamicFinder.ORDER_ASC; - addOrderPossiblyNested(query, queryRoot, criteriaBuilder, entity, sort, order, ignoreCase); - } } else if (useDefaultMapping) { + } else { + final String sort = (String) sortObj; + final String order = + DynamicFinder.ORDER_DESC.equalsIgnoreCase( + (String) argMap.get(DynamicFinder.ARGUMENT_ORDER)) + ? DynamicFinder.ORDER_DESC + : DynamicFinder.ORDER_ASC; + addOrderPossiblyNested(query, queryRoot, criteriaBuilder, entity, sort, order, ignoreCase); + } + } else if (useDefaultMapping) { Class<?> theClass = entity.getJavaClass(); Mapping m = MappingCacheHolder.getInstance().getMapping(theClass); if (m != null) { @@ -124,21 +127,22 @@ public class GrailsHibernateQueryUtils { * @param argMap The arguments map */ @SuppressWarnings("rawtypes") - public static void populateArgumentsForCriteria( - PersistentEntity entity, - Query query, - Map argMap, - ConversionService conversionService, - boolean useDefaultMapping) { - final Integer maxParam = - argMap.containsKey(DynamicFinder.ARGUMENT_MAX) - ? conversionService.convert(argMap.get(DynamicFinder.ARGUMENT_MAX), Integer.class) - : null; - final Integer offsetParam = - argMap.containsKey(DynamicFinder.ARGUMENT_OFFSET) - ? conversionService.convert(argMap.get(DynamicFinder.ARGUMENT_OFFSET), Integer.class) - : null; - if (argMap.containsKey(DynamicFinder.ARGUMENT_FETCH_SIZE)) { query.setFetchSize( + public static void populateArgumentsForCriteria( + PersistentEntity entity, + Query query, + Map argMap, + ConversionService conversionService, + boolean useDefaultMapping) { + final Integer maxParam = + argMap.containsKey(DynamicFinder.ARGUMENT_MAX) + ? conversionService.convert(argMap.get(DynamicFinder.ARGUMENT_MAX), Integer.class) + : null; + final Integer offsetParam = + argMap.containsKey(DynamicFinder.ARGUMENT_OFFSET) + ? conversionService.convert(argMap.get(DynamicFinder.ARGUMENT_OFFSET), Integer.class) + : null; + if (argMap.containsKey(DynamicFinder.ARGUMENT_FETCH_SIZE)) { + query.setFetchSize( conversionService.convert(argMap.get(DynamicFinder.ARGUMENT_FETCH_SIZE), Integer.class)); } if (argMap.containsKey(DynamicFinder.ARGUMENT_TIMEOUT)) { 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 381a3c4b53..60fa4a5386 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 @@ -341,7 +341,8 @@ public class HibernateQuery extends Query { return createdAssociationPaths.get(associationPath); } else { CriteriaQuery criteriaQuery = getCriteriaBuilder().createQuery(entity.getJavaClass()); - CriteriaAndAlias subCriteria = new CriteriaAndAlias(criteriaQuery, effectiveAlias, associationPath); + CriteriaAndAlias subCriteria = + new CriteriaAndAlias(criteriaQuery, effectiveAlias, associationPath); createdAssociationPaths.put(associationPath, subCriteria); createdAssociationPaths.put(effectiveAlias, subCriteria); return subCriteria;
