You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/02/21 17:21:47 UTC

(grails-core) 12/22: Fix multiple projections by using Object[] and criteriaBuilder.array instead of Tuple

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

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

commit e43fc37a87469a0870139c9285040ad7f7abfab3
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Fri Feb 20 12:38:02 2026 -0600

    Fix multiple projections by using Object[] and criteriaBuilder.array instead of Tuple
---
 .../grails/orm/hibernate/query/JpaCriteriaQueryCreator.java  | 12 ++++++------
 1 file changed, 6 insertions(+), 6 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 6162991cf4..25fbc9db0c 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
@@ -1,6 +1,7 @@
 package org.grails.orm.hibernate.query;
 
 import grails.gorm.DetachedCriteria;
+
 import jakarta.persistence.criteria.CriteriaQuery;
 import jakarta.persistence.criteria.Expression;
 import jakarta.persistence.criteria.From;
@@ -51,7 +52,7 @@ public class JpaCriteriaQueryCreator {
         assignProjections(projectionList, cq, tablesByName);
 
         List<Query.GroupPropertyProjection> groupProjections = collectGroupProjections();
-        assignGroupBy(groupProjections, root, cq, tablesByName);
+        assignGroupBy(groupProjections, cq, tablesByName);
 
         assignOrderBy(cq, tablesByName);
         assignCriteria(cq, root,tablesByName,entity);
@@ -72,9 +73,7 @@ public class JpaCriteriaQueryCreator {
         projections.stream()
                 .filter( it -> it instanceof Query.DistinctProjection || it instanceof Query.DistinctPropertyProjection)
                 .findFirst()
-                .ifPresent(projection -> {
-                    cq.distinct(true);
-                });
+                .ifPresent(projection -> cq.distinct(true));
         return cq;
     }
 
@@ -87,13 +86,14 @@ public class JpaCriteriaQueryCreator {
         if (projectionExpressions.size() == 1) {
             cq.select((Selection<? extends T>) projectionExpressions.get(0));
         } else if (projectionExpressions.size() > 1){
-            cq.multiselect(projectionExpressions);
+            var selectionArray = projectionExpressions.toArray(new Selection<?>[0]);
+            ((JpaCriteriaQuery<Object[]>)cq).select(criteriaBuilder.array(selectionArray));
         } else {
             cq.select((Selection<? extends T>) tablesByName.getFullyQualifiedPath("root"));
         }
     }
 
-    private void assignGroupBy(List<Query.GroupPropertyProjection> groupProjections, From<?, ?> root, CriteriaQuery<?> cq, JpaFromProvider tablesByName) {
+    private void assignGroupBy(List<Query.GroupPropertyProjection> groupProjections, CriteriaQuery<?> cq, JpaFromProvider tablesByName) {
         if (!groupProjections.isEmpty()) {
             List<Expression<?>> groupByPaths = (List) groupProjections
                     .stream()