You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2025/08/26 09:28:18 UTC
(grails-core) 13/25: more to HibernateHqlQuery
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 <wb...@mac.com>
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;
+ }
+
}