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;
+    }
+
 }

Reply via email to