This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch feat/gorm-registry-core in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit ff482db686c42996856325fca8e8435c299d1473 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sat Jun 27 09:42:16 2026 -0500 fix: missing HQL method overrides in H5/H7 static API and defensive ConnectionProvider lookup AbstractHibernateGormStaticApi / HibernateGormStaticApi (H5 and H7): - Add missing @Override for findAll(CharSequence, Collection), find(CharSequence, Collection), executeQuery(CharSequence, Collection), executeUpdate(CharSequence, Collection), and getAll(Iterable<Serializable>). Without these, calls to the two-argument Collection variants resolved to GormStaticApi.super, which bypassed HQL execution and fell into dynamic-finder or metaclass dispatch. - Internal single-argument dispatch methods (findAll(query), find(query), executeQuery(query), executeUpdate(query), find(query, params), findAll(query, params), etc.) now delegate directly to the three-argument HQL methods instead of super.*, ensuring HQL is always executed through the Hibernate path regardless of call site. - Remove stale propertyMissing override in H5 HibernateGormStaticApi (no longer needed after the GORM scaling registry refactor). GrailsHibernateTemplate (H5): - Wrap the ConnectionProvider service lookup in a try/catch for UnknownServiceException. Secondary/child datastores created from a SingletonConnectionSources do not register a ConnectionProvider, causing construction to fail with an opaque service error. Co-Authored-By: Claude Sonnet 4.6 <[email protected]> --- .../AbstractHibernateGormStaticApi.groovy | 36 +++++++++++++++++----- .../orm/hibernate/GrailsHibernateTemplate.java | 8 ++++- .../orm/hibernate/HibernateGormStaticApi.groovy | 11 +++---- .../orm/hibernate/HibernateGormStaticApi.groovy | 35 +++++++++++++++------ 4 files changed, 65 insertions(+), 25 deletions(-) diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy index 5df12aac79..0dac2c588e 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy @@ -361,6 +361,11 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { } } + @Override + D find(CharSequence query, Collection params) { + find(query, params, [:]) + } + @CompileDynamic // required for Hibernate 5.2 compatibility def <D> D findWithSql(CharSequence sql, Map args = Collections.emptyMap()) { IHibernateTemplate template = hibernateTemplate @@ -441,7 +446,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return findAll(hql, params, Collections.emptyMap()) } else { - return super.findAll(query) + return findAll(query, Collections.emptyMap(), Collections.emptyMap()) } } @@ -453,7 +458,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return executeQuery(hql, params, Collections.emptyMap()) } else { - return super.executeQuery(query) + return executeQuery(query, Collections.emptyMap(), Collections.emptyMap()) } } @@ -465,7 +470,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return executeUpdate(hql, params, Collections.emptyMap()) } else { - return super.executeUpdate(query) + return executeUpdate(query, Collections.emptyMap(), Collections.emptyMap()) } } @@ -477,7 +482,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return find(hql, params, Collections.emptyMap()) } else { - return (D) super.find(query) + return find(query, Collections.emptyMap(), Collections.emptyMap()) } } @@ -489,7 +494,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return find(hql, newParams, newParams) } else { - return (D) super.find(query, params) + return find(query, params, Collections.emptyMap()) } } @@ -501,7 +506,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return findAll(hql, newParams, newParams) } else { - return super.findAll(query, params) + return findAll(query, params, Collections.emptyMap()) } } @@ -513,7 +518,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return executeQuery(hql, newParams, newParams) } else { - return super.executeQuery(query, args) + return executeQuery(query, args, Collections.emptyMap()) } } @@ -525,7 +530,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { return executeUpdate(hql, newParams, newParams) } else { - return super.executeUpdate(query, args) + return executeUpdate(query, args, Collections.emptyMap()) } } @@ -558,6 +563,11 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { } } + @Override + List<D> findAll(CharSequence query, Collection params) { + findAll(query, params, [:]) + } + @Override D find(D exampleObject, Map args) { def template = hibernateTemplate @@ -667,6 +677,11 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { } } + @Override + List executeQuery(CharSequence query, Collection params) { + executeQuery(query, params, [:]) + } + @Override D findWhere(Map queryMap, Map args) { if (!queryMap) return null @@ -703,6 +718,11 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> { getAllInternal(ids as List) } + @Override + List<D> getAll(Iterable<Serializable> ids) { + getAllInternal(ids as List) + } + @CompileDynamic private List getAllInternal(List ids) { if (!ids) return [] diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java index 8edfffdaad..23a7f64ba8 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java @@ -53,6 +53,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.event.spi.EventSource; import org.hibernate.exception.GenericJDBCException; +import org.hibernate.service.UnknownServiceException; import org.hibernate.query.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -99,7 +100,12 @@ public class GrailsHibernateTemplate implements IHibernateTemplate { Assert.notNull(sessionFactory, "Property 'sessionFactory' is required"); this.sessionFactory = sessionFactory; - ConnectionProvider connectionProvider = ((SessionFactoryImplementor) sessionFactory).getServiceRegistry().getService(ConnectionProvider.class); + ConnectionProvider connectionProvider = null; + try { + connectionProvider = ((SessionFactoryImplementor) sessionFactory).getServiceRegistry().getService(ConnectionProvider.class); + } catch (UnknownServiceException ignored) { + // secondary/child datastores may not register ConnectionProvider + } if (connectionProvider instanceof DatasourceConnectionProviderImpl) { this.dataSource = ((DatasourceConnectionProviderImpl) connectionProvider).getDataSource(); if (dataSource instanceof TransactionAwareDataSourceProxy) { diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy index 33724ab93e..52a63f4a94 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy @@ -39,7 +39,6 @@ import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.support.TransactionSynchronizationManager import grails.orm.HibernateCriteriaBuilder -import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.finders.DynamicFinder import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.mapping.query.api.BuildableCriteria as GrailsCriteria @@ -133,11 +132,6 @@ class HibernateGormStaticApi<D> extends AbstractHibernateGormStaticApi<D> { } } - @Override - def propertyMissing(String name) { - return GormEnhancer.findStaticApi(persistentClass, name) - } - @Override GrailsCriteria createCriteria() { def builder = new HibernateCriteriaBuilder(persistentClass, sessionFactory) @@ -211,6 +205,11 @@ class HibernateGormStaticApi<D> extends AbstractHibernateGormStaticApi<D> { } } + @Override + Integer executeUpdate(CharSequence query, Collection params) { + executeUpdate(query, params, [:]) + } + protected <T> T withQueryEvents(Query query, Closure<T> callable) { HibernateDatastore hibernateDatastore = (HibernateDatastore) datastore diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy index 6419bf7681..322b34c537 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy @@ -50,7 +50,6 @@ import grails.gorm.DetachedCriteria import org.grails.datastore.gorm.GormStaticApi import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.mapping.core.connections.ConnectionSource -import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider import org.grails.datastore.mapping.proxy.ProxyHandler import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.query.api.BuildableCriteria as GrailsCriteria @@ -414,6 +413,26 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { doListInternal(query, [:], positionalParams, args, false) } + @Override + List<D> findAll(CharSequence query, Collection positionalParams) { + findAll(query, positionalParams, [:]) + } + + @Override + D find(CharSequence query, Collection positionalParams) { + find(query, positionalParams, [:]) + } + + @Override + List executeQuery(CharSequence query, Collection positionalParams) { + executeQuery(query, positionalParams, [:]) + } + + @Override + Integer executeUpdate(CharSequence query, Collection positionalParams) { + executeUpdate(query, positionalParams, [:]) + } + private List<D> getAllInternal(List ids) { if (!ids) return [] String idName = persistentEntity.identity.name @@ -430,6 +449,11 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { getAllInternal(ids as List) } + @Override + List<D> getAll(Iterable<Serializable> ids) { + getAllInternal(ids as List) + } + protected List<D> doListInternal(CharSequence hql, Map namedParams, Collection positionalParams, @@ -550,15 +574,6 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> { result } - @Override - def propertyMissing(String name) { - if (datastore instanceof ConnectionSourcesProvider) { - return HibernateGormEnhancer.findStaticApi(persistentClass, name) - } else { - throw new MissingPropertyException(name, persistentClass) - } - } - @Override GrailsCriteria createCriteria() { return new HibernateCriteriaBuilder(persistentClass, sessionFactory, (HibernateDatastore) datastore)
