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:28 UTC
(grails-core) 23/25: more deduplication
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 0ea31dc5aca9163d1e4081e3df04f17eca012995
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Sun Aug 24 13:47:05 2025 -0500
more deduplication
---
.../orm/hibernate/HibernateGormStaticApi.groovy | 187 ++++++++++-----------
.../orm/hibernate/query/HibernateHqlQuery.java | 9 +-
.../hibernate/HibernateGormStaticApiSpec.groovy | 6 +-
3 files changed, 99 insertions(+), 103 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 93936042f5..aa18412cd9 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
@@ -45,15 +45,12 @@ import org.hibernate.NonUniqueResultException
import org.hibernate.Session
import org.hibernate.SessionFactory
import org.hibernate.jpa.QueryHints
-import org.hibernate.query.NativeQuery
import org.hibernate.query.Query
import org.hibernate.query.criteria.JpaPredicate
import org.springframework.core.convert.ConversionService
import org.springframework.orm.hibernate5.SessionHolder
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.support.TransactionSynchronizationManager
-
-import jakarta.persistence.FlushModeType
import jakarta.persistence.criteria.CriteriaBuilder
import jakarta.persistence.criteria.CriteriaQuery
@@ -234,55 +231,18 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
}
@Override
- D find(CharSequence query, Map queryNamedArgs, Map args) {
- queryNamedArgs = new LinkedHashMap(queryNamedArgs)
- args = new LinkedHashMap(args)
- if(query instanceof GString) {
- query = buildNamedParameterQueryFromGString((GString) query, queryNamedArgs)
- }
-
- String queryString = query.toString()
- query = normalizeMultiLineQueryString(queryString)
-
- def template = hibernateTemplate
- queryNamedArgs = new HashMap(queryNamedArgs)
- return (D) template.execute { Session session ->
- def hqlQuery = HibernateHqlQuery.createHqlQuery(session, datastore as HibernateDatastore, sessionFactory, persistentEntity, queryString, false)
- template.applySettings(hqlQuery.getQuery());
- hqlQuery.populateQuerySettings(queryNamedArgs)
- hqlQuery.populateQuerySettings(args)
- hqlQuery.populateQueryWithNamedArguments(queryNamedArgs)
- hqlQuery.singleResult()
- }
+ D find(CharSequence query, Map namedParams, Map args) {
+ doSingleInternal(query,namedParams,[],args)
}
@Override
- D find(CharSequence query, Collection params, Map args) {
- def result = numberedParameterQuery(query, args, params)
- result ? result.first() : null
+ D find(CharSequence query, Collection positionalParams, Map args) {
+ doSingleInternal(query,[:],positionalParams,args)
}
@Override
- List<D> findAll(CharSequence query, Map params, Map args) {
-
- params = new LinkedHashMap(params)
- args = new LinkedHashMap(args)
- if(query instanceof GString) {
- query = buildNamedParameterQueryFromGString((GString) query, params)
- }
-
- String queryString = query.toString()
- queryString = normalizeMultiLineQueryString(queryString)
-
- def template = hibernateTemplate
- return (List<D>) template.execute { Session session ->
- def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session, datastore as HibernateDatastore, sessionFactory, persistentEntity,queryString, false)
- template.applySettings(hibernateHqlQuery.getQuery())
- hibernateHqlQuery.populateQuerySettings(params)
- hibernateHqlQuery.populateQuerySettings(args)
- hibernateHqlQuery.populateQueryWithNamedArguments(params)
- hibernateHqlQuery.list()
- }
+ List<D> findAll(CharSequence query, Map namedParams, Map args) {
+ doListInternal(query,namedParams,[],args)
}
@CompileDynamic // required for Hibernate 5.2 compatibility
@@ -345,14 +305,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
@Override
List executeQuery(CharSequence query) {
- if(query instanceof GString) {
- Map params = [:]
- String hql = buildNamedParameterQueryFromGString((GString)query, params)
- return executeQuery(hql, params, Collections.emptyMap())
- }
- else {
- return super.executeQuery(query)
- }
+ return doListInternal(query, [:], [], [:])
}
@Override
@@ -369,50 +322,22 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
@Override
D find(CharSequence query) {
- if(query instanceof GString) {
- Map params = [:]
- String hql = buildNamedParameterQueryFromGString((GString)query, params)
- return find(hql, params, Collections.emptyMap())
- }
- else {
- return (D)super.find(query)
- }
+ doSingleInternal(query,[:],[],[:])
}
@Override
D find(CharSequence query, Map params) {
- if(query instanceof GString) {
- Map newParams = new LinkedHashMap(params)
- String hql = buildNamedParameterQueryFromGString((GString)query, newParams)
- return find(hql, newParams, newParams)
- }
- else {
- return (D)super.find(query, params)
- }
+ doSingleInternal(query, params, [], [:])
}
@Override
List<D> findAll(CharSequence query, Map params) {
- if(query instanceof GString) {
- Map newParams = new LinkedHashMap(params)
- String hql = buildNamedParameterQueryFromGString((GString)query, newParams)
- return findAll(hql, newParams, newParams)
- }
- else {
- return super.findAll(query, params)
- }
+ doListInternal(query, params, [], [:])
}
@Override
List executeQuery(CharSequence query, Map args) {
- if(query instanceof GString) {
- Map newParams = new LinkedHashMap(args)
- String hql = buildNamedParameterQueryFromGString((GString)query, newParams)
- return executeQuery(hql, newParams, newParams)
- }
- else {
- return super.executeQuery(query, args)
- }
+ return doListInternal(query, [:], [], args)
}
@@ -451,26 +376,86 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
}
@Override
- List executeQuery(CharSequence query, Map params, Map args) {
- def template = hibernateTemplate
- args = new HashMap(args)
- params = new HashMap(params)
+ List executeQuery(CharSequence query, Map namedParams, Map args) {
+ return doListInternal(query, namedParams, [], args)
+ }
- if(query instanceof GString) {
- query = buildNamedParameterQueryFromGString((GString) query, params)
+ @SuppressWarnings('GroovyAssignabilityCheck')
+ private List doListInternal(CharSequence queryString,
+ Map namedParams,
+ Collection positionalParams,
+ Map args) {
+ def template = hibernateTemplate
+ if (queryString instanceof GString) {
+ if (positionalParams) {
+ queryString = buildOrdinalParameterQueryFromGString((GString)queryString, positionalParams as List)
+ } else {
+ queryString = buildNamedParameterQueryFromGString((GString)queryString, namedParams)
+ }
}
+ String hql = normalizeMultiLineQueryString(queryString?.toString())
+ Map argCopy = args != null ? new HashMap(args) : Collections.emptyMap()
return (List<D>) template.execute { Session session ->
-// Query q = (Query) session.createQuery(query.toString(),Object.class)
- def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(session, datastore as HibernateDatastore, sessionFactory, persistentEntity, query.toString(), false)
+ def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(
+ session, datastore as HibernateDatastore, sessionFactory, persistentEntity, hql, false)
template.applySettings(hibernateHqlQuery.getQuery())
- hibernateHqlQuery.populateQuerySettings(params)
- hibernateHqlQuery.populateQuerySettings(args)
- hibernateHqlQuery.populateQueryWithNamedArguments(params)
+
+ // apply query settings (max, offset, cache, etc.)
+ hibernateHqlQuery.populateQuerySettings(argCopy)
+
+ // apply parameters
+ if (namedParams) {
+ Map namedCopy = new HashMap(namedParams)
+ hibernateHqlQuery.populateQueryWithNamedArguments(namedCopy)
+ } else if (positionalParams) {
+ List positionalList = (positionalParams instanceof List) ? (List) positionalParams : new ArrayList(positionalParams)
+ hibernateHqlQuery.populateQueryWithIndexedArguments(positionalList)
+ }
+
+ // execute
hibernateHqlQuery.list()
}
}
+ @SuppressWarnings('GroovyAssignabilityCheck')
+ private D doSingleInternal(CharSequence queryString,
+ Map namedParams,
+ Collection positionalParams,
+ Map args) {
+ def template = hibernateTemplate
+ if (queryString instanceof GString) {
+ if (positionalParams) {
+ queryString = buildOrdinalParameterQueryFromGString((GString)queryString, positionalParams as List)
+ } else {
+ queryString = buildNamedParameterQueryFromGString((GString)queryString, namedParams)
+ }
+ }
+ String hql = normalizeMultiLineQueryString(queryString?.toString())
+ Map argCopy = args != null ? new HashMap(args) : Collections.emptyMap()
+
+ return (D) template.execute { Session session ->
+ def hibernateHqlQuery = HibernateHqlQuery.createHqlQuery(
+ session, datastore as HibernateDatastore, sessionFactory, persistentEntity, hql, false)
+ template.applySettings(hibernateHqlQuery.getQuery())
+
+ // apply query settings (max, offset, cache, etc.)
+ hibernateHqlQuery.populateQuerySettings(argCopy)
+
+ // apply parameters
+ if (namedParams) {
+ Map namedCopy = new HashMap(namedParams)
+ hibernateHqlQuery.populateQueryWithNamedArguments(namedCopy)
+ } else if (positionalParams) {
+ List positionalList = (positionalParams instanceof List) ? (List) positionalParams : new ArrayList(positionalParams)
+ hibernateHqlQuery.populateQueryWithIndexedArguments(positionalList)
+ }
+
+ // execute
+ hibernateHqlQuery.singleResult()
+ }
+ }
+
private List<D> numberedParameterQuery(CharSequence query, Map args, params) {
@@ -492,13 +477,13 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
}
@Override
- List executeQuery(CharSequence query, Collection params, Map args) {
- numberedParameterQuery(query, args, params)
+ List executeQuery(CharSequence query, Collection positionalParams, Map args) {
+ return doListInternal(query,[:], positionalParams, args)
}
@Override
- List<D> findAll(CharSequence query, Collection params, Map args) {
- numberedParameterQuery(query, args, params)
+ List<D> findAll(CharSequence query, Collection positionalParams, Map args) {
+ doListInternal(query,[:], positionalParams, args)
}
@Override
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 e0d9900aa6..7eaa6708ff 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,8 @@
package org.grails.orm.hibernate.query;
import jakarta.persistence.FlushModeType;
+import org.apache.groovy.parser.antlr4.util.StringUtils;
+import org.codehaus.groovy.util.StringUtil;
import org.grails.datastore.gorm.finders.DynamicFinder;
import org.grails.datastore.mapping.core.Datastore;
import org.grails.datastore.mapping.core.Session;
@@ -74,7 +76,12 @@ public class HibernateHqlQuery extends Query {
// Normalize only for HQL (not for native SQL)
String hqlToUse = isNative ? sqlString : normalizeNonAliasedSelect(sqlString);
var clazz = getTarget(hqlToUse, persistentEntity.getJavaClass());
- var q = isNative ? session.createNativeQuery(sqlString, clazz) : session.createQuery(hqlToUse, clazz);
+ org.hibernate.query.Query q = null;
+ if (StringUtils.isEmpty(hqlToUse)) {
+ session.createQuery("from " + clazz.getName(), clazz);
+ } else {
+ q = isNative ? session.createNativeQuery(hqlToUse, clazz) : session.createQuery(hqlToUse, clazz);
+ }
var hibernateSession = new HibernateSession( dataStore, sessionFactory);
HibernateHqlQuery hibernateHqlQuery = new HibernateHqlQuery(hibernateSession, null, q);
hibernateHqlQuery.setFlushMode(session.getHibernateFlushMode());
diff --git a/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormStaticApiSpec.groovy b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormStaticApiSpec.groovy
index f647394a20..6e4a1630a0 100644
--- a/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormStaticApiSpec.groovy
+++ b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormStaticApiSpec.groovy
@@ -226,7 +226,11 @@ class HibernateGormStaticApiSpec extends HibernateGormDatastoreSpec {
new HibernateGormStaticApiEntity(name: "test").save(flush: true, failOnError: true)
when:
- def updated = HibernateGormStaticApiEntity.executeUpdate("update HibernateGormStaticApiEntity set name = 'updated' where name = 'test'")
+ def updated
+ HibernateGormStaticApiEntity.withNewTransaction { status ->
+ updated = HibernateGormStaticApiEntity.executeUpdate("update HibernateGormStaticApiEntity set name = 'updated' where name = 'test'")
+
+ }
def instance = HibernateGormStaticApiEntity.first()
then: