This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit ad9902dc818a6eb654124e89c3d4c1d4126606f2 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Fri Mar 20 07:25:17 2026 -0500 hibernate 7: JpaCriteriaQueryCreator cleaned up and spec fixed --- .../hibernate/query/JpaCriteriaQueryCreator.java | 4 +- .../gorm/specs/HibernateGormDatastoreSpec.groovy | 6 ++ .../JpaCriteriaQueryCreatorSpec.groovy | 65 +++++++++++++++++++--- 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java index 2d89b22f70..05abe24f3b 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java @@ -71,7 +71,7 @@ public class JpaCriteriaQueryCreator { var cq = createCriteriaQuery(projectionList); Class<?> javaClass = entity.getJavaClass(); Root<?> root = cq.from(javaClass); - var tablesByName = new JpaFromProvider(detachedCriteria, projectionList, cq, root); + var tablesByName = new JpaFromProvider(detachedCriteria, projectionList, root); assignProjections(projectionList, cq, tablesByName); assignGroupBy(cq, tablesByName); @@ -85,7 +85,7 @@ public class JpaCriteriaQueryCreator { var projectionList = collectProjections(); Class<?> javaClass = entity.getJavaClass(); Root<?> root = subquery.from(javaClass); - var tablesByName = new JpaFromProvider(detachedCriteria, projectionList, subquery, root); + var tablesByName = new JpaFromProvider(detachedCriteria, projectionList, root); var aliasedProjections = new java.util.concurrent.atomic.AtomicInteger(0); var projectionExpressions = projectionList.stream() diff --git a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy index 4b9323e4bf..6387405c9d 100644 --- a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy @@ -19,9 +19,11 @@ package grails.gorm.specs +import grails.orm.HibernateCriteriaBuilder import org.apache.grails.data.hibernate7.core.GrailsDataHibernate7TckManager import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.query.api.BuildableCriteria import org.grails.orm.hibernate.HibernateSession import org.grails.orm.hibernate.HibernateDatastore import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder @@ -154,6 +156,10 @@ class HibernateGormDatastoreSpec extends GrailsDataTckSpec<GrailsDataHibernate7T manager.hibernateDatastore } + protected org.hibernate.query.criteria.HibernateCriteriaBuilder getCriteriaBuilder() { + return getSessionFactory().getCriteriaBuilder(); + } + protected HibernateSession getSession() { datastore.connect() as HibernateSession diff --git a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy index 4605e8d6eb..660f300d1a 100644 --- a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/JpaCriteriaQueryCreatorSpec.groovy @@ -1,29 +1,30 @@ package grails.gorm.specs.hibernatequery +import org.hibernate.query.criteria.HibernateCriteriaBuilder +import spock.lang.Shared + import grails.gorm.DetachedCriteria import grails.gorm.specs.HibernateGormDatastoreSpec -import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.query.Query -import grails.orm.HibernateCriteriaBuilder import org.hibernate.query.criteria.JpaCriteriaQuery import org.grails.orm.hibernate.query.JpaCriteriaQueryCreator import org.springframework.core.convert.support.DefaultConversionService -import spock.lang.Shared import grails.gorm.annotation.Entity import org.grails.datastore.gorm.GormEntity class JpaCriteriaQueryCreatorSpec extends HibernateGormDatastoreSpec { + void setupSpec() { manager.addAllDomainClasses([JpaCriteriaQueryCreatorSpecPerson, JpaCriteriaQueryCreatorSpecPet]) } def "test createQuery"() { given: - HibernateCriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder() + var entity = manager.hibernateDatastore.getMappingContext().getPersistentEntity(JpaCriteriaQueryCreatorSpecPerson.name) var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPerson) - var creator = new JpaCriteriaQueryCreator(criteriaBuilder, entity, detachedCriteria, new DefaultConversionService()) + var creator = new JpaCriteriaQueryCreator(new Query.ProjectionList(), criteriaBuilder, entity, detachedCriteria, new DefaultConversionService()) when: JpaCriteriaQuery<?> query = creator.createQuery() @@ -34,7 +35,7 @@ class JpaCriteriaQueryCreatorSpec extends HibernateGormDatastoreSpec { def "test createQuery with projections"() { given: - HibernateCriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder() + var entity = manager.hibernateDatastore.getMappingContext().getPersistentEntity(JpaCriteriaQueryCreatorSpecPerson.name) var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPerson) @@ -53,7 +54,7 @@ class JpaCriteriaQueryCreatorSpec extends HibernateGormDatastoreSpec { def "test createQuery with distinct"() { given: - HibernateCriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder() + var entity = manager.hibernateDatastore.getMappingContext().getPersistentEntity(JpaCriteriaQueryCreatorSpecPerson.name) var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPerson) @@ -74,7 +75,7 @@ class JpaCriteriaQueryCreatorSpec extends HibernateGormDatastoreSpec { def "test createQuery with association projection triggers auto-join"() { given: - HibernateCriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder() + var entity = manager.hibernateDatastore.getMappingContext().getPersistentEntity(JpaCriteriaQueryCreatorSpecPet.name) var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPet) @@ -90,6 +91,54 @@ class JpaCriteriaQueryCreatorSpec extends HibernateGormDatastoreSpec { noExceptionThrown() query != null } + + def "test createQuery with order by"() { + given: + var entity = getPersistentEntity(JpaCriteriaQueryCreatorSpecPerson) + var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPerson) + detachedCriteria.order(Query.Order.asc("firstName")) + var creator = new JpaCriteriaQueryCreator(new Query.ProjectionList(), criteriaBuilder, entity, detachedCriteria, new DefaultConversionService()) + + when: + JpaCriteriaQuery<?> query = creator.createQuery() + + then: + query != null + } + + def "test createQuery with group by"() { + given: + var entity = getPersistentEntity(JpaCriteriaQueryCreatorSpecPerson) + var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPerson) + var projections = new Query.ProjectionList() + projections.groupProperty("lastName") + var creator = new JpaCriteriaQueryCreator(projections, criteriaBuilder, entity, detachedCriteria, new DefaultConversionService()) + + when: + JpaCriteriaQuery<?> query = creator.createQuery() + + then: + query != null + } + + def "test populateSubquery"() { + given: + var entity = getPersistentEntity(JpaCriteriaQueryCreatorSpecPerson) + var detachedCriteria = new DetachedCriteria(JpaCriteriaQueryCreatorSpecPerson) + detachedCriteria.eq("firstName", "Bob") + + var creator = new JpaCriteriaQueryCreator(new Query.ProjectionList(), criteriaBuilder, entity, detachedCriteria, new DefaultConversionService()) + + // Create a parent query to get a subquery from + var parentCq = criteriaBuilder.createQuery(JpaCriteriaQueryCreatorSpecPerson) + var subquery = parentCq.subquery(Long) + + when: + creator.populateSubquery(subquery) + + then: + noExceptionThrown() + } } @Entity
