This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch merge-hibernate6 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 7b950572095e05b170580db3b3b55edf4862f0a1 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Aug 18 12:54:12 2025 -0500 more to HibernateHqlQuery --- .../orm/hibernate/HibernateGormStaticApi.groovy | 68 ++++------ .../orm/hibernate/query/HibernateHqlQuery.java | 137 ++++++++++++++++++--- 2 files changed, 143 insertions(+), 62 deletions(-) diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy index 666e15a34b..f1a65f06d2 100644 --- a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy @@ -247,14 +247,11 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { def template = hibernateTemplate queryNamedArgs = new HashMap(queryNamedArgs) return (D) template.execute { Session session -> - Query q = (Query) session.createQuery(queryString, persistentEntity.javaClass) - template.applySettings(q) - - populateQueryArguments(q, queryNamedArgs) - populateQueryArguments(q, args) - populateQueryWithNamedArguments(q, queryNamedArgs) - - def hqlQuery = HibernateHqlQuery.createHqlQuery(session, q, datastore as HibernateDatastore, sessionFactory, persistentEntity) + def hqlQuery = HibernateHqlQuery.createHqlQuery(session, datastore as HibernateDatastore, sessionFactory, persistentEntity, queryString) + template.applySettings(hqlQuery.getQuery()); + hqlQuery.populateQuerySettings(queryNamedArgs) + hqlQuery.populateQuerySettings(args) + hqlQuery.populateQueryWithNamedArguments(queryNamedArgs) hqlQuery.singleResult() } } @@ -278,15 +275,11 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { def template = hibernateTemplate return (List<D>) template.execute { Session session -> - Query q = (Query) session.createQuery(queryString) - template.applySettings(q) - - populateQueryArguments(q, params) - populateQueryArguments(q, args) - populateQueryWithNamedArguments(q, params) - - - def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session, q, datastore as HibernateDatastore, sessionFactory, persistentEntity) + def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session, datastore as HibernateDatastore, sessionFactory, persistentEntity,queryString) + template.applySettings(hibernateHqlQuery.getQuery()) + hibernateHqlQuery.populateQuerySettings(params) + hibernateHqlQuery.populateQuerySettings(args) + hibernateHqlQuery.populateQueryWithNamedArguments(params) hibernateHqlQuery.list() } } @@ -318,8 +311,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { populateQueryArguments(q, args) q.setMaxResults(1) - def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session,q, datastore as HibernateDatastore,sessionFactory,persistentEntity) - def results = hibernateHqlQuery.list() + def results = createHqlQuery(session, q).list() if(results.isEmpty()) { return null } @@ -355,8 +347,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { q.addEntity(persistentClass) populateQueryArguments(q, args) - def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session,q, datastore as HibernateDatastore,sessionFactory,persistentEntity) - return hibernateHqlQuery.list() + return createHqlQuery(session, q).list() } } @@ -491,14 +482,11 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { return (List<D>) template.execute { Session session -> Query q = (Query) session.createQuery(query.toString(),Object.class) - template.applySettings(q) - - populateQueryArguments(q, params) - populateQueryArguments(q, args) - populateQueryWithNamedArguments(q, params) - - def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session,q, datastore as HibernateDatastore,sessionFactory,persistentEntity) + template.applySettings(hibernateHqlQuery.getQuery()) + hibernateHqlQuery.populateQuerySettings(params) + hibernateHqlQuery.populateQuerySettings(args) + hibernateHqlQuery.populateQueryWithNamedArguments(params) hibernateHqlQuery.list() } } @@ -515,23 +503,11 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { args = new HashMap(args) return (List<D>) template.execute { Session session -> - - - Query q = (Query) session.createQuery(queryString, persistentEntity.javaClass) - template.applySettings(q) - - params.eachWithIndex { val, int i -> - var index = i + 1 - if (val instanceof CharSequence) { - q.setParameter index, val.toString() - } else { - q.setParameter index, val - } - } - populateQueryArguments(q, args) - - def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session,q, datastore as HibernateDatastore,sessionFactory,persistentEntity) - hibernateHqlQuery.list() + def hqlQuery = HibernateHqlQuery.createHqlQuery(session, datastore as HibernateDatastore, sessionFactory, persistentEntity, queryString) + template.applySettings(hqlQuery.getQuery()) + hqlQuery.populateQuerySettings(args) + hqlQuery.populateQueryWithIndexedArguments(params as List) + hqlQuery.list() } } @@ -926,7 +902,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { default: hibernateSession.setFlushMode(FlushModeType.COMMIT) } - return HibernateHqlQuery.createHqlQuery(session,q, datastore as HibernateDatastore,sessionFactory,persistentEntity) + return new HibernateHqlQuery(hibernateSession, persistentEntity, q) } } diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java index 8c5542de0f..576e469636 100644 --- a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java @@ -1,6 +1,7 @@ package org.grails.orm.hibernate.query; import jakarta.persistence.FlushModeType; +import org.grails.datastore.gorm.finders.DynamicFinder; import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.model.PersistentEntity; @@ -9,10 +10,18 @@ import org.grails.datastore.mapping.query.event.PostQueryEvent; import org.grails.datastore.mapping.query.event.PreQueryEvent; import org.grails.orm.hibernate.HibernateDatastore; import org.grails.orm.hibernate.HibernateSession; +import org.grails.orm.hibernate.exceptions.GrailsQueryException; +import org.hibernate.FlushMode; import org.hibernate.SessionFactory; +import org.hibernate.query.NativeQuery; import org.springframework.context.ApplicationEventPublisher; +import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.IntStream; /** * A query implementation for HQL queries @@ -21,7 +30,7 @@ import java.util.List; * @since 6.0 */ public class HibernateHqlQuery extends Query { - private final org.hibernate.query.Query query; + private org.hibernate.query.Query query; public HibernateHqlQuery(Session session, PersistentEntity entity, org.hibernate.query.Query query) { super(session, entity); @@ -55,20 +64,116 @@ public class HibernateHqlQuery extends Query { } - public static HibernateHqlQuery createHqlQuery(org.hibernate.Session session - , org.hibernate.query.Query q - , HibernateDatastore dataStore - , SessionFactory sessionFactory - , PersistentEntity persistentEntity - ) { - var hibernateSession = new HibernateSession( dataStore, sessionFactory); - switch (session.getHibernateFlushMode()) { - case AUTO, ALWAYS: - hibernateSession.setFlushMode(FlushModeType.AUTO); - break; - default: - hibernateSession.setFlushMode(FlushModeType.COMMIT); - } - return new HibernateHqlQuery(hibernateSession, persistentEntity, q); + public static HibernateHqlQuery createHqlQuery( + org.hibernate.Session session + , HibernateDatastore dataStore + , SessionFactory sessionFactory + , PersistentEntity persistentEntity + , String sqlString) { + var q = session.createQuery(sqlString, persistentEntity.getJavaClass()); + var hibernateSession = new HibernateSession( dataStore, sessionFactory); + HibernateHqlQuery hibernateHqlQuery = new HibernateHqlQuery(hibernateSession, persistentEntity, q); + hibernateHqlQuery.setFlushMode(session.getHibernateFlushMode()); + return hibernateHqlQuery; + } + + public static HibernateHqlQuery createHqlQuery(org.hibernate.Session session + , org.hibernate.query.Query q + , HibernateDatastore dataStore + , SessionFactory sessionFactory + , PersistentEntity persistentEntity + ) { + var hibernateSession = new HibernateSession( dataStore, sessionFactory); + switch (session.getHibernateFlushMode()) { + case AUTO, ALWAYS: + hibernateSession.setFlushMode(FlushModeType.AUTO); + break; + default: + hibernateSession.setFlushMode(FlushModeType.COMMIT); } + return new HibernateHqlQuery(hibernateSession, persistentEntity, q); + } + + + public void setFlushMode(FlushMode flushMode) { + session.setFlushMode(flushMode == FlushMode.AUTO || flushMode == FlushMode.ALWAYS ? + FlushModeType.AUTO : FlushModeType.COMMIT); + } + + public void populateQuerySettings(Map args) { + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_MAX)) + .map(Object::toString) + .map(Integer::parseInt) + .ifPresent(query::setMaxResults); + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_OFFSET)) + .map(Object::toString) + .map(Integer::parseInt) + .ifPresent(query::setFirstResult); + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_CACHE)) + .map(Object::toString) + .map(Boolean::parseBoolean) + .ifPresent(query::setCacheable); + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_FETCH_SIZE)) + .map(Object::toString) + .map(Integer::parseInt) + .ifPresent(query::setFetchSize); + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_TIMEOUT)) + .map(Object::toString) + .map(Integer::parseInt) + .ifPresent(query::setTimeout); + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_READ_ONLY)) + .map(Object::toString) + .map(Boolean::parseBoolean) + .ifPresent(query::setReadOnly); + Optional.ofNullable(args.remove(DynamicFinder.ARGUMENT_FLUSH_MODE)) + .filter(FlushMode.class::isInstance) + .map(FlushMode.class::cast) + .ifPresent(query::setHibernateFlushMode); + + } + + public void populateQueryWithNamedArguments(Map queryNamedArgs) { + Optional.ofNullable(queryNamedArgs).ifPresent( map -> { + map.forEach((key, value) -> { + if (key instanceof CharSequence) { + String stringKey = key.toString(); + if(value == null) { + query.setParameter(stringKey, null); + } else if (value instanceof CharSequence) { + query.setParameter(stringKey, value.toString()); + } else if (List.class.isAssignableFrom(value.getClass())) { + query.setParameterList(stringKey, (List) value); + } else if (Set.class.isAssignableFrom(value.getClass())) { + query.setParameterList(stringKey, (Set) value); + } else if (value.getClass().isArray()) { + query.setParameterList( stringKey, (Object[]) value); + } else { + query.setParameter(stringKey, value); + } + } else { + throw new GrailsQueryException("Named parameter's name must be String: $queryNamedArgs"); + } + }); + }); + } + + public void populateQueryWithIndexedArguments(List params) { + Optional.ofNullable(params).ifPresent( collection -> { + IntStream.range(1, collection.size() + 1) + .forEach( index -> { + var val = collection.get(index - 1); + if (val instanceof CharSequence) { + query.setParameter(index, val.toString()); + } else { + query.setParameter(index, val); + } + }); + }); + } + + + public org.hibernate.query.Query getQuery() { + return query; + } + }
