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 <[email protected]> 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:
