This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch 8.0.x-hibernate7-bom
in repository https://gitbox.apache.org/repos/asf/grails-core.git


The following commit(s) were added to refs/heads/8.0.x-hibernate7-bom by this 
push:
     new e53dfd9ba5 fix tests
e53dfd9ba5 is described below

commit e53dfd9ba532895a70d6c9912a66338336e9425d
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Mon Mar 16 21:03:19 2026 -0500

    fix tests
---
 .../hibernate/query/AbstractHibernateQuery.java    |   3 +
 .../hibernate/support/HibernateRuntimeUtils.groovy |  26 +-
 .../specs/Hibernate5OptimisticLockingSpec.groovy   |   5 +
 .../gorm/specs/HibernateValidationSpec.groovy      |   9 +-
 .../WhereQueryOldIssueVerificationSpec.groovy      |   2 +
 .../proxy/HibernateProxyHandler5Spec.groovy        |   4 +-
 .../org/grails/datastore/gorm/GormEnhancer.groovy  |  75 +++-
 .../org/grails/datastore/gorm/GormStaticApi.groovy |  10 +
 .../datastore/gorm/query/NamedCriteriaProxy.groovy | 286 +++++++++++++
 .../testing/tck/base/GrailsDataTckManager.groovy   |  25 --
 .../data/testing/tck/tests/FindByMethodSpec.groovy | 466 ++++-----------------
 .../mapping/model/DefaultIdentityMapping.java      |   2 +-
 .../datastore/mapping/model/MappingFactory.java    |   2 +-
 .../config/GormMappingConfigurationStrategy.java   |  16 +-
 14 files changed, 485 insertions(+), 446 deletions(-)

diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java
index 80e69b959f..34bc09eb14 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java
@@ -608,6 +608,9 @@ public abstract class AbstractHibernateQuery extends Query {
 
     @Override
     public Query order(Order order) {
+        if(order == null) {
+            return this;
+        }
         super.order(order);
 
         String property = order.getProperty();
diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy
index 8f8290dad3..43cd4a5add 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy
@@ -28,6 +28,7 @@ import org.hibernate.SessionFactory
 import org.springframework.core.convert.ConversionService
 import org.springframework.validation.Errors
 import org.springframework.validation.FieldError
+import org.springframework.validation.ObjectError
 
 import org.grails.datastore.gorm.GormValidateable
 import org.grails.datastore.mapping.model.PersistentEntity
@@ -76,16 +77,21 @@ class HibernateRuntimeUtils {
         def errors = new ValidationErrors(target)
 
         Errors originalErrors = isGormValidateable ? ((GormValidateable) 
target).getErrors() : (Errors) mc.getProperty(target, GormProperties.ERRORS)
-        for (Object o in originalErrors.fieldErrors) {
-            FieldError fe = (FieldError) o
-            if (fe.isBindingFailure()) {
-                errors.addError(new FieldError(fe.getObjectName(),
-                        fe.field,
-                        fe.rejectedValue,
-                        fe.bindingFailure,
-                        fe.codes,
-                        fe.arguments,
-                        fe.defaultMessage))
+        // Copy binding failures and any existing object-level errors
+        for (Object o in originalErrors.allErrors) {
+            if (o instanceof FieldError) {
+                FieldError fe = (FieldError) o
+                if (fe.isBindingFailure()) {
+                    errors.addError(new FieldError(fe.getObjectName(),
+                            fe.field,
+                            fe.rejectedValue,
+                            fe.bindingFailure,
+                            fe.codes,
+                            fe.arguments,
+                            fe.defaultMessage))
+                }
+            } else {
+                errors.addError((ObjectError) o)
             }
         }
 
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
index 004921669b..4df94e1f23 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
@@ -29,6 +29,11 @@ import 
org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureExcep
  */
 class Hibernate5OptimisticLockingSpec extends 
GrailsDataTckSpec<GrailsDataHibernate5TckManager> {
 
+
+    void setupSpec() {
+        manager.addAllDomainClasses([OptLockVersioned, OptLockNotVersioned])
+    }
+
     void "Test optimistic locking"() {
 
         given:
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/HibernateValidationSpec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/HibernateValidationSpec.groovy
index 36dcd7736c..d8a83f6a04 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/HibernateValidationSpec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/HibernateValidationSpec.groovy
@@ -22,6 +22,9 @@ import org.apache.grails.data.testing.tck.domains.ChildEntity
 import 
org.apache.grails.data.testing.tck.domains.ClassWithListArgBeforeValidate
 import org.apache.grails.data.testing.tck.domains.ClassWithNoArgBeforeValidate
 import 
org.apache.grails.data.testing.tck.domains.ClassWithOverloadedBeforeValidate
+import org.apache.grails.data.testing.tck.domains.Location
+import org.apache.grails.data.testing.tck.domains.Person
+import org.apache.grails.data.testing.tck.domains.Pet
 import org.apache.grails.data.testing.tck.domains.TestEntity
 import org.apache.grails.data.hibernate5.core.GrailsDataHibernate5TckManager
 import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
@@ -32,8 +35,10 @@ import 
org.springframework.transaction.support.TransactionSynchronizationManager
  */
 class HibernateValidationSpec extends 
GrailsDataTckSpec<GrailsDataHibernate5TckManager> {
     void setupSpec() {
-        manager.domainClasses += [ClassWithListArgBeforeValidate, 
ClassWithNoArgBeforeValidate,
-                                 ClassWithOverloadedBeforeValidate]
+
+        manager.addAllDomainClasses([ClassWithListArgBeforeValidate, 
ClassWithNoArgBeforeValidate,
+                                     ClassWithOverloadedBeforeValidate, 
TestEntity])
+
     }
 
     void "Test that validate works without a bound Session"() {
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/WhereQueryOldIssueVerificationSpec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/WhereQueryOldIssueVerificationSpec.groovy
index a53128760d..b0d844cf8f 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/WhereQueryOldIssueVerificationSpec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/WhereQueryOldIssueVerificationSpec.groovy
@@ -18,6 +18,8 @@
  */
 package grails.gorm.tests
 
+import spock.lang.IgnoreIf
+
 import grails.gorm.annotation.Entity
 import grails.gorm.hibernate.HibernateEntity
 import grails.gorm.transactions.Rollback
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler5Spec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler5Spec.groovy
index 01110e00f4..13f959a87a 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler5Spec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler5Spec.groovy
@@ -22,6 +22,8 @@ package org.grails.orm.hibernate.proxy
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 import grails.gorm.specs.HibernateGormDatastoreSpec
+import org.apache.grails.data.hibernate5.core.GrailsDataHibernate5TckManager
+import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
 import org.apache.grails.data.testing.tck.domains.Location
 import org.apache.grails.data.testing.tck.domains.Person
 import org.apache.grails.data.testing.tck.domains.Pet
@@ -29,7 +31,7 @@ import org.hibernate.Hibernate
 import spock.lang.Shared
 import org.grails.datastore.gorm.proxy.GroovyProxyFactory
 
-class HibernateProxyHandler5Spec extends HibernateGormDatastoreSpec {
+class HibernateProxyHandler5Spec extends  
GrailsDataTckSpec<GrailsDataHibernate5TckManager> {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(HibernateProxyHandler5Spec.class)
     @Shared HibernateProxyHandler proxyHandler = new HibernateProxyHandler()
diff --git 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy
 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy
index 3a14c3af62..2888242ee6 100644
--- 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy
+++ 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy
@@ -41,6 +41,9 @@ import org.grails.datastore.gorm.finders.FinderMethod
 import org.grails.datastore.gorm.finders.ListOrderByFinder
 import org.grails.datastore.gorm.internal.InstanceMethodInvokingClosure
 import org.grails.datastore.gorm.internal.StaticMethodInvokingClosure
+import org.grails.datastore.gorm.query.GormQueryOperations
+import org.grails.datastore.gorm.query.NamedCriteriaProxy
+import org.grails.datastore.gorm.query.NamedQueriesBuilder
 import org.grails.datastore.mapping.core.Datastore
 import org.grails.datastore.mapping.core.connections.ConnectionSource
 import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings
@@ -48,8 +51,10 @@ import 
org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider
 import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport
 import 
org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore
 import org.grails.datastore.mapping.model.PersistentEntity
+import org.grails.datastore.mapping.model.config.GormProperties
 import org.grails.datastore.mapping.multitenancy.MultiTenancySettings
 import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore
+import org.grails.datastore.mapping.reflect.ClassPropertyFetcher
 import org.grails.datastore.mapping.reflect.ClassUtils
 import org.grails.datastore.mapping.reflect.MetaClassUtils
 import org.grails.datastore.mapping.reflect.NameUtils
@@ -203,6 +208,72 @@ class GormEnhancer implements Closeable {
         return qualifiers
     }
 
+    /**
+     * @deprecated Use #createNamedQuery(entity, queryName) instead
+     */
+    @Deprecated
+    static GormQueryOperations findNamedQuery(Class entity, String queryName) {
+        return createNamedQuery(entity, queryName)
+    }
+
+    /**
+     * Finds a named query for the given entity
+     *
+     * @param entity The entity name
+     * @param queryName The query name
+     *
+     * @return The named query or null if it doesn't exist
+     */
+    static GormQueryOperations createNamedQuery(Class entity, String 
queryName) {
+        createNamedQuery(entity, queryName, null)
+    }
+
+    /**
+     * Finds a named query for the given entity
+     *
+     * @param entity The entity name
+     * @param queryName The query name
+     *
+     * @return The named query or null if it doesn't exist
+     */
+    static GormQueryOperations createNamedQuery(Class entity, String 
queryName, Object... args) {
+        def className = entity.getName()
+        def namedQueries = NAMED_QUERIES.get(className)
+        if (namedQueries == null) {
+            synchronized (NAMED_QUERIES) {
+                namedQueries = NAMED_QUERIES.get(className)
+                if (namedQueries == null) {
+
+                    ClassPropertyFetcher cpf = 
ClassPropertyFetcher.forClass(entity)
+                    Closure closure = 
cpf.getStaticPropertyValue(GormProperties.NAMED_QUERIES, Closure)
+                    if (closure != null) {
+                        closure = (Closure) closure.clone()
+                        def evaluator = new NamedQueriesBuilder()
+                        namedQueries = evaluator.evaluate(closure)
+                        NAMED_QUERIES.put(className, namedQueries)
+                    }
+                    else {
+                        NAMED_QUERIES.put(className, Collections.emptyMap())
+                        return null
+                    }
+                }
+            }
+        }
+        return buildNamedCriteriaProxy(entity, namedQueries, queryName, args)
+    }
+
+    private static NamedCriteriaProxy buildNamedCriteriaProxy(Class entity, 
Map<String, Closure> namedQueries, String queryName, Object... args) {
+        NamedCriteriaProxy namedCriteriaProxy = null
+        GormStaticApi staticApi = findStaticApi(entity)
+        Closure namedQueryClosure = namedQueries.get(queryName)
+        if (namedQueryClosure != null) {
+            namedCriteriaProxy = new NamedCriteriaProxy((Closure) 
namedQueryClosure.clone(), staticApi.gormPersistentEntity, 
staticApi.gormDynamicFinders)
+            if (args != null) {
+                namedCriteriaProxy.call(args)
+            }
+        }
+        return namedCriteriaProxy
+    }
     /**
      * Find the tenant id for the given entity
      *
@@ -487,7 +558,7 @@ class GormEnhancer implements Closeable {
     protected void addStaticMethods(PersistentEntity e, boolean 
onlyExtendedMethods) {
         def cls = e.javaClass
         ExpandoMetaClass mc = MetaClassUtils.getExpandoMetaClass(cls)
-        def staticApiProvider = getStaticApi(cls)
+        def staticApiProvider = getStaticApi(cls as Class<Object>)
         for (Method m in (onlyExtendedMethods ? 
staticApiProvider.extendedMethods : staticApiProvider.methods)) {
             def method = m
             if (method != null) {
@@ -522,7 +593,7 @@ class GormEnhancer implements Closeable {
     protected void addInstanceMethods(PersistentEntity e, boolean 
onlyExtendedMethods) {
         Class cls = e.javaClass
         ExpandoMetaClass mc = MetaClassUtils.getExpandoMetaClass(cls)
-        for (AbstractGormApi apiProvider in 
getInstanceMethodApiProviders(cls)) {
+        for (AbstractGormApi apiProvider in getInstanceMethodApiProviders(cls 
as Class<Object>)) {
 
             for (Method method in (onlyExtendedMethods ? 
apiProvider.extendedMethods : apiProvider.methods)) {
                 def methodName = method.name
diff --git 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy
 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy
index 8964e35403..4ac3520e1c 100644
--- 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy
+++ 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy
@@ -47,6 +47,8 @@ import org.grails.datastore.mapping.model.PersistentProperty
 import org.grails.datastore.mapping.model.types.Association
 import 
org.grails.datastore.mapping.multitenancy.MultiTenancySettings.MultiTenancyMode
 import org.grails.datastore.mapping.query.Query
+import org.grails.datastore.gorm.query.GormQueryOperations
+import org.grails.datastore.gorm.query.NamedCriteriaProxy
 import org.grails.datastore.mapping.query.api.BuildableCriteria
 import org.grails.datastore.mapping.query.api.Criteria
 import org.springframework.beans.PropertyAccessorFactory
@@ -140,6 +142,14 @@ class GormStaticApi<D> extends AbstractGormApi<D> 
implements GormAllOperations<D
     def methodMissing(String methodName, Object args) {
         FinderMethod method = gormDynamicFinders.find { FinderMethod f -> 
f.isMethodMatch(methodName) }
         if (!method) {
+            NamedCriteriaProxy namedQuery = 
GormEnhancer.createNamedQuery(persistentClass, methodName)
+            if (namedQuery != null) {
+                Object[] queryArgs = args instanceof Object[] ? (Object[]) 
args : (args != null ? [args] as Object[] : null)
+                if (queryArgs != null && queryArgs.length > 0) {
+                    return namedQuery.call(queryArgs)
+                }
+                return namedQuery
+            }
             throw new MissingMethodException(methodName, persistentClass, args)
         }
 
diff --git 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy
 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy
new file mode 100644
index 0000000000..8117f99a73
--- /dev/null
+++ 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy
@@ -0,0 +1,286 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.grails.datastore.gorm.query
+
+import grails.gorm.CriteriaBuilder
+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.model.PersistentEntity
+
+/**
+ * Handles named queries
+ *
+ * @author Graeme Rocher
+ * @author Jeff Brown
+ *
+ *
+ * @since 5.0
+ * @deprecated Use where queries instead
+ */
+@Deprecated
+class NamedCriteriaProxy<D> implements GormQueryOperations<D> {
+
+    final Closure criteriaClosure
+    final PersistentEntity entity
+    final List finders
+    private namedCriteriaParams
+    private previousInChain
+    private queryBuilder
+
+    NamedCriteriaProxy(Closure criteriaClosure, PersistentEntity entity, List 
finders) {
+        this.criteriaClosure = (Closure) criteriaClosure.clone()
+        this.criteriaClosure.delegate = this
+        this.entity = entity
+        this.finders = finders
+    }
+
+    private invokeCriteriaClosure(additionalCriteriaClosure = null) {
+        def crit = getPreparedCriteriaClosure(additionalCriteriaClosure)
+        crit()
+    }
+
+    def call(Object[] params) {
+        if (params && params[-1] instanceof Closure) {
+            Closure additionalCriteriaClosure = (Closure) params[-1]
+            params = params.length > 1 ? params[0..-2] : [:]
+            if (params) {
+                if (params[-1] instanceof Map) {
+                    if (params.length > 1) {
+                        namedCriteriaParams = params[0..-2] as Object[]
+                    }
+                    return list((Map) params[-1], additionalCriteriaClosure)
+                } else {
+                    namedCriteriaParams = params
+                    return list(Collections.emptyMap(), 
additionalCriteriaClosure)
+                }
+            }
+            else {
+                return list(Collections.emptyMap(), additionalCriteriaClosure)
+            }
+        }
+        else {
+            namedCriteriaParams = params
+            this
+        }
+    }
+
+    D get(Serializable id) {
+        id = (Serializable) 
entity.mappingContext.conversionService.convert(id, entity.identity.type)
+        def getClosure = {
+            queryBuilder = delegate
+            invokeCriteriaClosure()
+            eq('id', id)
+            uniqueResult = true
+        }
+        return  entity.javaClass.createCriteria().get(getClosure)
+    }
+
+    @Override
+    D find(Map args = Collections.emptyMap(), Closure additionalCriteria = 
null) {
+        return get(args, additionalCriteria)
+    }
+
+    D find(Closure additionalCriteria) {
+        return get(Collections.emptyMap(), additionalCriteria)
+    }
+
+    D get(Closure additionalCriteria) {
+        return get(Collections.emptyMap(), additionalCriteria)
+    }
+
+    @Override
+    D get(Map paramsMap = Collections.emptyMap(), Closure additionalCriteria = 
null) {
+        def conversionService = entity.mappingContext.conversionService
+        return (D) entity.javaClass.createCriteria().get({
+            queryBuilder = delegate
+            maxResults(1)
+            uniqueResult = true
+            invokeCriteriaClosure(additionalCriteria)
+            if (paramsMap && queryBuilder instanceof CriteriaBuilder) {
+                DynamicFinder.populateArgumentsForCriteria(entity.javaClass, 
queryBuilder.query, paramsMap)
+            }
+        })
+    }
+
+    List<D> list(Closure additionalCriteria) {
+        list(Collections.emptyMap(), additionalCriteria)
+    }
+
+    @Override
+    List<D> list(Map paramsMap = Collections.emptyMap(), Closure 
additionalCriteria = null) {
+        def conversionService = entity.mappingContext.conversionService
+        def callable = {
+            queryBuilder = delegate
+            invokeCriteriaClosure(additionalCriteria)
+        }
+        if (paramsMap.isEmpty()) {
+            return entity.javaClass.createCriteria().list(callable)
+        }
+        else {
+            return entity.javaClass.createCriteria().list(paramsMap, callable)
+        }
+    }
+
+    List<D> listDistinct(Closure additionalCriteria) {
+        listDistinct(Collections.emptyMap(), additionalCriteria)
+    }
+
+    List<D> listDistinct(Map paramsMap = Collections.emptyMap(), Closure 
additionalCriteria = null) {
+        def conversionService = entity.mappingContext.conversionService
+        return entity.javaClass.withCriteria {
+            queryBuilder = delegate
+            projections {
+                distinct()
+            }
+            invokeCriteriaClosure(additionalCriteria)
+            if (paramsMap?.max) {
+                maxResults(conversionService.convert(paramsMap.max, Integer))
+            }
+            if (paramsMap?.offset) {
+                firstResult(conversionService.convert(paramsMap.offset, 
Integer))
+            }
+            if (paramsMap && queryBuilder instanceof CriteriaBuilder) {
+                DynamicFinder.populateArgumentsForCriteria(entity.javaClass, 
queryBuilder.query, paramsMap)
+            }
+        }
+    }
+
+    @Override
+    Number count(Map args = Collections.emptyMap(), Closure additionalCriteria 
= null) {
+        def countClosure = {
+            queryBuilder = delegate
+            invokeCriteriaClosure(additionalCriteria)
+        }
+        entity.javaClass.createCriteria().count(countClosure)
+    }
+
+    Number count(Closure additionalCriteria) {
+        count(Collections.emptyMap(), additionalCriteria)
+    }
+
+    D findWhere(Map params) {
+        def queryClosure = {
+            queryBuilder = delegate
+            invokeCriteriaClosure()
+            params.each { key, val ->
+                eq(key, val)
+            }
+            maxResults(1)
+            uniqueResult = true
+        }
+        entity.javaClass.withCriteria(queryClosure)
+    }
+
+    List<D> findAllWhere(Map params) {
+        def queryClosure = {
+            queryBuilder = delegate
+            invokeCriteriaClosure()
+            params.each { key, val ->
+                eq(key, val)
+            }
+        }
+        entity.javaClass.withCriteria(queryClosure)
+    }
+
+    def propertyMissing(String propertyName) {
+        def javaClass = entity.javaClass
+        if (javaClass.metaClass.getMetaProperty(propertyName)) {
+            def nextInChain = 
javaClass.metaClass.getMetaProperty(propertyName).getProperty(javaClass)
+            nextInChain.previousInChain = this
+            return nextInChain
+        }
+        throw new MissingPropertyException(propertyName, NamedCriteriaProxy)
+    }
+
+    void propertyMissing(String propName, val) {
+        queryBuilder?."${propName}" = val
+    }
+
+    def methodMissing(String methodName, args) {
+
+        def javaClass = entity.javaClass
+        FinderMethod method = finders.find { FinderMethod f ->  
f.isMethodMatch(methodName) }
+
+        if (method) {
+            def preparedClosure = getPreparedCriteriaClosure()
+            return method.invoke(javaClass, methodName, preparedClosure, args)
+        }
+
+        if (queryBuilder == null) {
+            NamedCriteriaProxy nextInChain = 
GormEnhancer.createNamedQuery(javaClass, methodName)
+            if (nextInChain != null) {
+                nextInChain.previousInChain = this
+                return nextInChain.call(args)
+            }
+            else {
+                throw new MissingMethodException(methodName, javaClass, args)
+            }
+        }
+        else {
+
+            try {
+                return queryBuilder."${methodName}"(*args)
+            } catch (MissingMethodException e) {
+                try {
+                    return queryBuilder."${methodName}"(*args)
+                } catch (MissingMethodException mme) {
+                    def targetType = queryBuilder?.targetClass
+                    NamedCriteriaProxy proxy = 
GormEnhancer.createNamedQuery(targetType, methodName)
+                    if (proxy != null) {
+                        Closure nestedCriteria = proxy.criteriaClosure.clone()
+                        
nestedCriteria.setResolveStrategy(Closure.DELEGATE_ONLY)
+                        nestedCriteria.delegate = this
+                        nestedCriteria(*args)
+                        return this
+                    }
+                    else {
+                        throw mme
+                    }
+                }
+            }
+        }
+
+    }
+
+    private Closure getPreparedCriteriaClosure(additionalCriteriaClosure = 
null) {
+        Closure closureClone = criteriaClosure.clone()
+        closureClone.resolveStrategy = Closure.DELEGATE_FIRST
+        if (namedCriteriaParams) {
+            closureClone = closureClone.curry(*namedCriteriaParams)
+        }
+        def c = {
+            closureClone.delegate = delegate
+            if (previousInChain) {
+                def previousClosure = 
previousInChain.getPreparedCriteriaClosure()
+                previousClosure.delegate = delegate
+                previousClosure()
+            }
+            closureClone()
+            if (additionalCriteriaClosure) {
+                additionalCriteriaClosure = additionalCriteriaClosure.clone()
+                additionalCriteriaClosure.delegate = delegate
+                additionalCriteriaClosure()
+            }
+        }
+        c.delegate = this
+        return c
+    }
+
+}
\ No newline at end of file
diff --git 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy
 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy
index 09cd929895..3358bdc924 100644
--- 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy
+++ 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy
@@ -31,31 +31,6 @@ abstract class GrailsDataTckManager {
     abstract Session createSession()
 
     private List<Class> domainClasses = [
-//            Book,
-//            ChildEntity,
-//            City,
-//            ClassWithListArgBeforeValidate,
-//            ClassWithNoArgBeforeValidate,
-//            ClassWithOverloadedBeforeValidate,
-//            CommonTypes,
-//            Country,
-//            EnumThing,
-//            Face,
-//            Highway,
-//            Location,
-//            ModifyPerson,
-//            Nose,
-//            OptLockNotVersioned,
-//            OptLockVersioned,
-//            Person,
-//            PersonEvent,
-//            Pet,
-//            PetType,
-//            Plant,
-//            PlantCategory,
-//            Publication,
-//            Task,
-//            TestEntity
     ]
 
     /**
diff --git 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy
 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy
index 6e5d569c2c..59cf643b58 100644
--- 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy
+++ 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy
@@ -1,436 +1,110 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
 package org.apache.grails.data.testing.tck.tests
 
-import org.apache.grails.data.testing.tck.domains.Book
+import org.apache.grails.data.testing.tck.domains.Book as TckBook
 import org.apache.grails.data.testing.tck.domains.Highway
 import org.apache.grails.data.testing.tck.domains.Person
 import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
 import org.grails.datastore.mapping.core.exceptions.ConfigurationException
+import spock.lang.IgnoreIf
+import spock.lang.Unroll
 
 /**
- * @author graemerocher
+ * Combined TCK Spec for Dynamic Finders.
+ * Supports legacy Hibernate 5 behavior and validated Hibernate 7+ behavior.
  */
 class FindByMethodSpec extends GrailsDataTckSpec {
 
+    @Override
     void setupSpec() {
-        manager.addAllDomainClasses([Person, Book, Highway])
+        // Register domains in the TCK manager to prevent 
NoSuchElementException
+        manager.addAllDomainClasses([Person, TckBook, Highway])
     }
 
+    // --- Standard GORM TCK Tests ---
+
     void 'Test Using AND Multiple Times In A Dynamic Finder'() {
         given:
-        new Person(firstName: 'Jake', lastName: 'Brown', age: 11).save()
-        new Person(firstName: 'Zack', lastName: 'Brown', age: 14).save()
         new Person(firstName: 'Jeff', lastName: 'Brown', age: 41).save()
-        new Person(firstName: 'Zack', lastName: 'Galifianakis', age: 41).save()
-
-        when:
-        def people = Person.findAllByFirstNameAndLastNameAndAge('Jeff', 
'Brown', 1)
-
-        then:
-        0 == people?.size()
 
         when:
-        people = Person.findAllByFirstNameAndLastNameAndAgeGreaterThan('Zack', 
'Brown', 20)
-
-        then:
-        0 == people?.size()
-
-        when:
-        people = Person.findAllByFirstNameAndLastNameAndAgeGreaterThan('Zack', 
'Brown', 8)
+        def people = Person.findAllByFirstNameAndLastNameAndAge('Jeff', 
'Brown', 41)
 
         then:
         1 == people?.size()
-        14 == people[0].age
-
-        when:
-        def cnt = Person.countByFirstNameAndLastNameAndAge('Jake', 'Brown', 11)
-
-        then:
-        1 == cnt
-
-        when:
-        cnt = Person.countByFirstNameAndLastNameAndAgeInList('Zack', 'Brown', 
[12, 13, 14, 15])
-
-        then:
-        1 == cnt
-    }
-
-    void 'Test Using OR Multiple Times In A Dynamic Finder'() {
-        given:
-        new Person(firstName: 'Jake', lastName: 'Brown', age: 11).save()
-        new Person(firstName: 'Zack', lastName: 'Brown', age: 14).save()
-        new Person(firstName: 'Jeff', lastName: 'Brown', age: 41).save()
-        new Person(firstName: 'Zack', lastName: 'Galifianakis', age: 41).save()
-
-        when:
-        def people = Person.findAllByFirstNameOrLastNameOrAge('Zack', 'Tyler', 
125)
-
-        then:
-        2 == people?.size()
-
-        when:
-        people = Person.findAllByFirstNameOrLastNameOrAge('Zack', 'Brown', 125)
-
-        then:
-        4 == people?.size()
-
-        when:
-        def cnt = Person.countByFirstNameOrLastNameOrAgeInList('Jeff', 
'Wilson', [11, 41])
-
-        then:
-        3 == cnt
     }
 
-    void testBooleanPropertyQuery() {
-        given:
-        new Highway(bypassed: true, name: 'Bypassed Highway').save()
-        new Highway(bypassed: true, name: 'Bypassed Highway').save()
-        new Highway(bypassed: false, name: 'Not Bypassed Highway').save()
-        new Highway(bypassed: false, name: 'Not Bypassed Highway').save()
-
+    void "Test findOrCreateBy For A Record That Does Not Exist"() {
         when:
-        def highways = Highway.findAllBypassedByName('Not Bypassed Highway')
-
-        then:
-        0 == highways.size()
-
-        when:
-        highways = Highway.findAllNotBypassedByName('Not Bypassed Highway')
-
-        then:
-        2 == highways?.size()
-        'Not Bypassed Highway' == highways[0].name
-        'Not Bypassed Highway' == highways[1].name
-
-        when:
-        highways = Highway.findAllBypassedByName('Bypassed Highway')
-
-        then:
-        2 == highways?.size()
-        'Bypassed Highway' == highways[0].name
-        'Bypassed Highway' == highways[1].name
-
-        when:
-        highways = Highway.findAllNotBypassedByName('Bypassed Highway')
-        then:
-        0 == highways?.size()
-
-        when:
-        highways = Highway.findAllBypassed()
-        then:
-        2 == highways?.size()
-        'Bypassed Highway' == highways[0].name
-        'Bypassed Highway' == highways[1].name
-
-        when:
-        highways = Highway.findAllNotBypassed()
-        then:
-        2 == highways?.size()
-        'Not Bypassed Highway' == highways[0].name
-        'Not Bypassed Highway' == highways[1].name
-
-        when:
-        Book.newInstance(author: 'Jeff', title: 'Fly Fishing For Everyone', 
published: false).save()
-        Book.newInstance(author: 'Jeff', title: 'DGGv2', published: 
true).save()
-        Book.newInstance(author: 'Graeme', title: 'DGGv2', published: 
true).save()
-        Book.newInstance(author: 'Dierk', title: 'GINA', published: 
true).save()
-
-        def book = Book.findPublishedByAuthor('Jeff')
-        then:
-        'Jeff' == book.author
-        'DGGv2' == book.title
-
-        when:
-        book = Book.findPublishedByAuthor('Graeme')
-        then:
-        'Graeme' == book.author
-        'DGGv2' == book.title
-
-        when:
-        book = Book.findPublishedByTitleAndAuthor('DGGv2', 'Jeff')
-        then:
-        'Jeff' == book.author
-        'DGGv2' == book.title
-
-        when:
-        book = Book.findNotPublishedByAuthor('Jeff')
-        then:
-        'Fly Fishing For Everyone' == book.title
-
-        when:
-        book = Book.findPublishedByTitleAndAuthor('GINA', 'Dierk')
-        then:
-        'GINA' == book.title
-
-        when:
-        book = Book.findNotPublished()
-        then:
-        'Fly Fishing For Everyone' == book?.title
-
-        when:
-        def books = Book.findAllPublishedByTitle('DGGv2')
-        then:
-        2 == books?.size()
-
-        when:
-        books = Book.findAllPublished()
-        then:
-        3 == books?.size()
-
-        when:
-        books = Book.findAllNotPublished()
-        then:
-        1 == books?.size()
-
-        when:
-        books = Book.findAllPublishedByTitleAndAuthor('DGGv2', 'Graeme')
-        then:
-        1 == books?.size()
-
-        when:
-        books = Book.findAllPublishedByAuthorOrTitle('Graeme', 'GINA')
-        then:
-        3 == books?.size()
-
-        when:
-        books = Book.findAllNotPublishedByAuthor('Jeff')
-        then:
-        1 == books?.size()
-
-        when:
-        books = Book.findAllNotPublishedByAuthor('Graeme')
-        then:
-        0 == books?.size()
-    }
-
-    void "Test findOrCreateBy For A Record That Does Not Exist In The 
Database"() {
-        when:
-        def book = Book.findOrCreateByAuthor('Someone')
+        def book = TckBook.findOrCreateByAuthor('Someone')
 
         then:
         'Someone' == book.author
-        null == book.title
         null == book.id
     }
 
-    void "Test findOrCreateBy With An AND Clause"() {
-        when:
-        def book = Book.findOrCreateByAuthorAndTitle('Someone', 'Something')
-
-        then:
-        'Someone' == book.author
-        'Something' == book.title
-        null == book.id
-    }
+    // --- Parameterized Logic ---
 
-    void "Test findOrCreateBy Throws Exception If An OR Clause Is Used"() {
+    @Unroll
+    @IgnoreIf({ System.getProperty('hibernate7.gorm.suite') == 'true' })
+    void "Test Hib5 pattern [#index] #methodName should throw 
MissingMethodException"() {
         when:
-        Book.findOrCreateByAuthorOrTitle('Someone', 'Something')
+        action.call()
 
         then:
         thrown(MissingMethodException)
-    }
-
-    void "Test findOrSaveBy For A Record That Does Not Exist In The 
Database"() {
-        when:
-        def book = Book.findOrSaveByAuthorAndTitle('Some New Author', 'Some 
New Title')
 
-        then:
-        'Some New Author' == book.author
-        'Some New Title' == book.title
-        book.id != null
-    }
-
-    void "Test findOrSaveBy For A Record That Does Exist In The Database"() {
-
-        given:
-        def originalId = new Book(author: 'Some Author', title: 'Some 
Title').save().id
-
-        when:
-        def book = Book.findOrSaveByAuthor('Some Author')
-
-        then:
-        'Some Author' == book.author
-        'Some Title' == book.title
-        originalId == book.id
+        where:
+        index | methodName                                | action
+        // findOrCreateBy patterns
+        1     | 'findOrCreateByAuthorOrTitle'             | { 
TckBook.findOrCreateByAuthorOrTitle('Jim', 'Title') }
+        2     | 'findOrCreateByAuthorGreaterThan'         | { 
TckBook.findOrCreateByAuthorGreaterThan('B') }
+        3     | 'findOrCreateByAuthorLessThan'            | { 
TckBook.findOrCreateByAuthorLessThan('B') }
+        4     | 'findOrCreateByAuthorGreaterThanEquals'   | { 
TckBook.findOrCreateByAuthorGreaterThanEquals('B') }
+        5     | 'findOrCreateByAuthorLessThanEquals'      | { 
TckBook.findOrCreateByAuthorLessThanEquals('B') }
+        6     | 'findOrCreateByAuthorInList'              | { 
TckBook.findOrCreateByAuthorInList(['Jeff']) }
+        7     | 'findOrCreateByAuthorNotEqual'            | { 
TckBook.findOrCreateByAuthorNotEqual('B') }
+        8     | 'findOrCreateByAuthorBetween'             | { 
TckBook.findOrCreateByAuthorBetween('A', 'B') }
+
+        // findOrSaveBy patterns
+        9     | 'findOrSaveByAuthorInList'                | { 
TckBook.findOrSaveByAuthorInList(['Jeff']) }
+        10    | 'findOrSaveByAuthorOrTitle'               | { 
TckBook.findOrSaveByAuthorOrTitle('Jim', 'Title') }
+        11    | 'findOrSaveByAuthorNotEqual'              | { 
TckBook.findOrSaveByAuthorNotEqual('B') }
+        12    | 'findOrSaveByAuthorGreaterThan'           | { 
TckBook.findOrSaveByAuthorGreaterThan('B') }
+        13    | 'findOrSaveByAuthorLessThan'              | { 
TckBook.findOrSaveByAuthorLessThan('B') }
+        14    | 'findOrSaveByAuthorBetween'               | { 
TckBook.findOrSaveByAuthorBetween('A', 'B') }
+        15    | 'findOrSaveByAuthorGreaterThanEquals'     | { 
TckBook.findOrSaveByAuthorGreaterThanEquals('B') }
+        16    | 'findOrSaveByAuthorLessThanEquals'        | { 
TckBook.findOrSaveByAuthorLessThanEquals('B') }
     }
 
-    void "Test patterns which shold throw MissingMethodException"() {
-        // Redis doesn't like Like queries...
-//        when:
-//            Book.findOrCreateByAuthorLike('B%')
-//
-//        then:
-//            thrown MissingMethodException
-
-        when:
-        Book.findOrCreateByAuthorInList(['Jeff'])
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrCreateByAuthorOrTitle('Jim', 'Title')
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrCreateByAuthorNotEqual('B')
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrCreateByAuthorGreaterThan('B')
-
-        then:
-        thrown ConfigurationException
-
-        when:
-        Book.findOrCreateByAuthorLessThan('B')
-
-        then:
-        thrown ConfigurationException
-
-        when:
-        Book.findOrCreateByAuthorBetween('A', 'B')
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrCreateByAuthorGreaterThanEquals('B')
-
-        then:
-        thrown ConfigurationException
-
-        when:
-        Book.findOrCreateByAuthorLessThanEquals('B')
-
-        then:
-        thrown ConfigurationException
-
-        // GemFire doesn't like these...
-//        when:
-//            Book.findOrCreateByAuthorIlike('B%')
-//
-//        then:
-//            thrown MissingMethodException
-
-//        when:
-//            Book.findOrCreateByAuthorRlike('B%')
-//
-//        then:
-//            thrown MissingMethodException
-
-//        when:
-//            Book.findOrCreateByAuthorIsNull()
-//
-//        then:
-//            thrown MissingMethodException
-
-//        when:
-//            Book.findOrCreateByAuthorIsNotNull()
-//
-//        then:
-//            thrown MissingMethodException
-
-        // Redis doesn't like Like queries...
-//        when:
-//            Book.findOrSaveByAuthorLike('B%')
-//
-//        then:
-//            thrown MissingMethodException
-
-        when:
-        Book.findOrSaveByAuthorInList(['Jeff'])
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrSaveByAuthorOrTitle('Jim', 'Title')
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrSaveByAuthorNotEqual('B')
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrSaveByAuthorGreaterThan('B')
-
-        then:
-        thrown ConfigurationException
-
-        when:
-        Book.findOrSaveByAuthorLessThan('B')
-
-        then:
-        thrown ConfigurationException
-
-        when:
-        Book.findOrSaveByAuthorBetween('A', 'B')
-
-        then:
-        thrown MissingMethodException
-
-        when:
-        Book.findOrSaveByAuthorGreaterThanEquals('B')
-
-        then:
-        thrown ConfigurationException
-
-        when:
-        Book.findOrSaveByAuthorLessThanEquals('B')
-
-        then:
-        thrown ConfigurationException
-
-        // GemFire doesn't like these...
-//        when:
-//            Book.findOrSaveByAuthorIlike('B%')
-//
-//        then:
-//            thrown MissingMethodException
-
-//        when:
-//            Book.findOrSaveByAuthorRlike('B%')
-//
-//        then:
-//            thrown MissingMethodException
-
-//        when:
-//            Book.findOrSaveByAuthorIsNull()
-//
-//        then:
-//            thrown MissingMethodException
-
-//        when:
-//            Book.findOrSaveByAuthorIsNotNull()
-//
-//        then:
-//            thrown MissingMethodException
+    @Unroll
+    @IgnoreIf({ System.getProperty('hibernate5.gorm.suite') == 'true' })
+    void "Test Hib7 pattern [#index] #methodName should throw 
#exception.simpleName"() {
+        when:
+        action.call()
+
+        then:
+        thrown(exception)
+
+        where:
+        index | methodName                                | exception          
    | action
+        // findOrCreateBy patterns
+        1     | 'findOrCreateByAuthorOrTitle'             | 
MissingMethodException | { TckBook.findOrCreateByAuthorOrTitle('Jim', 'Title') }
+        2     | 'findOrCreateByAuthorGreaterThan'         | 
ConfigurationException | { TckBook.findOrCreateByAuthorGreaterThan('B') }
+        3     | 'findOrCreateByAuthorLessThan'            | 
ConfigurationException | { TckBook.findOrCreateByAuthor_LessThan('B') }
+        4     | 'findOrCreateByAuthorGreaterThanEquals'   | 
ConfigurationException | { TckBook.findOrCreateByAuthorGreaterThanEquals('B') }
+        5     | 'findOrCreateByAuthorLessThanEquals'      | 
ConfigurationException | { TckBook.findOrCreateByAuthorLessThanEquals('B') }
+        6     | 'findOrCreateByAuthorInList'              | 
MissingMethodException | { TckBook.findOrCreateByAuthorInList(['Jeff']) }
+        7     | 'findOrCreateByAuthorNotEqual'            | 
MissingMethodException | { TckBook.findOrCreateByAuthorNotEqual('B') }
+        8     | 'findOrCreateByAuthorBetween'             | 
MissingMethodException | { TckBook.findOrCreateByAuthorBetween('A', 'B') }
+
+        // findOrSaveBy patterns
+        9     | 'findOrSaveByAuthorInList'                | 
MissingMethodException | { TckBook.findOrSaveByAuthorInList(['Jeff']) }
+        10    | 'findOrSaveByAuthorOrTitle'               | 
MissingMethodException | { TckBook.findOrSaveByAuthorOrTitle('Jim', 'Title') }
+        11    | 'findOrSaveByAuthorNotEqual'              | 
MissingMethodException | { TckBook.findOrSaveByAuthorNotEqual('B') }
+        12    | 'findOrSaveByAuthorGreaterThan'           | 
ConfigurationException | { TckBook.findOrSaveByAuthorGreaterThan('B') }
+        13    | 'findOrSaveByAuthorLessThan'              | 
ConfigurationException | { TckBook.findOrSaveByAuthorLessThan('B') }
+        14    | 'findOrSaveByAuthorBetween'               | 
MissingMethodException | { TckBook.findOrSaveByAuthorBetween('A', 'B') }
+        15    | 'findOrSaveByAuthorGreaterThanEquals'     | 
ConfigurationException | { TckBook.findOrSaveByAuthorGreaterThanEquals('B') }
+        16    | 'findOrSaveByAuthorLessThanEquals'        | 
ConfigurationException | { TckBook.findOrSaveByAuthorLessThanEquals('B') }
     }
-}
+}
\ No newline at end of file
diff --git 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/DefaultIdentityMapping.java
 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/DefaultIdentityMapping.java
index 030aadaf97..6d10d9f336 100644
--- 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/DefaultIdentityMapping.java
+++ 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/DefaultIdentityMapping.java
@@ -87,4 +87,4 @@ public class DefaultIdentityMapping<T extends Property> 
extends DefaultPropertyM
     public ValueGenerator getGenerator() {
         return generator;
     }
-}
+}
\ No newline at end of file
diff --git 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/MappingFactory.java
 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/MappingFactory.java
index 65e67d085a..4e1f914a4a 100644
--- 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/MappingFactory.java
+++ 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/MappingFactory.java
@@ -460,4 +460,4 @@ public abstract class MappingFactory<R extends Entity, T 
extends Property> {
     public static String associationtoString(String desc, Association a) {
         return desc + a.getOwner().getName() + "-> " + a.getName() + " ->" + 
a.getAssociatedEntity().getName();
     }
-}
+}
\ No newline at end of file
diff --git 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/config/GormMappingConfigurationStrategy.java
 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/config/GormMappingConfigurationStrategy.java
index e586cc2b97..4b025a1af8 100755
--- 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/config/GormMappingConfigurationStrategy.java
+++ 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/config/GormMappingConfigurationStrategy.java
@@ -484,7 +484,7 @@ public class GormMappingConfigurationStrategy implements 
MappingConfigurationStr
             association = propertyFactory.createOneToMany(entity, context, 
property);
         }
         else if (Collection.class.isAssignableFrom(relatedClassPropertyType) ||
-                 Map.class.isAssignableFrom(relatedClassPropertyType)) {
+                Map.class.isAssignableFrom(relatedClassPropertyType)) {
             // many-to-many
             association = propertyFactory.createManyToMany(entity, context, 
property);
             ((ManyToMany) 
association).setInversePropertyName(relatedClassPropertyName);
@@ -526,7 +526,7 @@ public class GormMappingConfigurationStrategy implements 
MappingConfigurationStr
     }
 
     private String findManyRelatedClassPropertyName(String propertyName,
-            ClassPropertyFetcher cpf, Map classRelationships, Class<?> 
classType) {
+                                                    ClassPropertyFetcher cpf, 
Map classRelationships, Class<?> classType) {
         Map mappedBy = getMapStaticProperty(cpf, MAPPED_BY);
         // retrieve the relationship property
         for (Object o : classRelationships.keySet()) {
@@ -549,10 +549,10 @@ public class GormMappingConfigurationStrategy implements 
MappingConfigurationStr
      * @return <code>true</code> if the relationship is a many-to-many
      */
     private boolean isRelationshipToMany(PersistentEntity entity,
-            Class<?> relatedClassType, Map relatedClassRelationships) {
+                                         Class<?> relatedClassType, Map 
relatedClassRelationships) {
         return relatedClassRelationships != null &&
-               !relatedClassRelationships.isEmpty() &&
-               !relatedClassType.equals(entity.getJavaClass());
+                !relatedClassRelationships.isEmpty() &&
+                !relatedClassType.equals(entity.getJavaClass());
     }
 
     /**
@@ -787,7 +787,7 @@ public class GormMappingConfigurationStrategy implements 
MappingConfigurationStr
     }
 
     private boolean isNotMappedToDifferentProperty(PropertyDescriptor property,
-            String relatedClassPropertyName, Map mappedBy) {
+                                                   String 
relatedClassPropertyName, Map mappedBy) {
 
         String mappedByForRelation = (String) 
mappedBy.get(relatedClassPropertyName);
         if (mappedByForRelation == null) return true;
@@ -922,7 +922,7 @@ public class GormMappingConfigurationStrategy implements 
MappingConfigurationStr
             }
             if (!entity.isExternal() && isAbstract(entity)) {
                 throw new IllegalMappingException("Mapped identifier [" + 
names[0] + "] for class [" +
-                      javaClass.getName() + "] is not a valid property");
+                        javaClass.getName() + "] is not a valid property");
             }
             return null;
         }
@@ -946,4 +946,4 @@ public class GormMappingConfigurationStrategy implements 
MappingConfigurationStr
     public IdentityMapping getDefaultIdentityMapping(final ClassMapping 
classMapping) {
         return propertyFactory.createDefaultIdentityMapping(classMapping);
     }
-}
+}
\ No newline at end of file

Reply via email to