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)

Reply via email to