From 44e4f1289ce35b7e633cb7085ac72f640c88bb61 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 5 Sep 2011 12:05:02 +0200 Subject: [PATCH] DATAJPA-86 - Pagination over queries using group-by works correctly. Added handling of count methods for queries using group by. In case the count query returns multiple results we use the number of results instead of failing. If the result contains one result we use this one. --- .../data/jpa/repository/query/JpaQueryExecution.java | 5 ++++- .../data/jpa/repository/UserRepositoryTests.java | 9 +++++++++ .../data/jpa/repository/sample/UserRepository.java | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java index 33d362483..fcaf3e9a1 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java @@ -15,6 +15,8 @@ */ package org.springframework.data.jpa.repository.query; +import java.util.List; + import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.Query; @@ -94,7 +96,8 @@ public abstract class JpaQueryExecution { // Execute query to compute total Query projection = repositoryQuery.createCountQuery(values); - Long total = (Long) projection.getSingleResult(); + List counts = projection.getResultList(); + Long total = counts.size() == 1 ? counts.get(0) : counts.size(); Query query = repositoryQuery.createQuery(values); diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index af579d7f9..c6471bd49 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -725,6 +725,15 @@ public class UserRepositoryTests { assertThat(result, hasItem(firstUser)); } + @Test + public void executesPaginationForGroupByQueryCorrectly() { + + flushTestUsers(); + + Page results = repository.findWithGroupBy(new PageRequest(0, 10)); + assertThat(results.getTotalPages(), is(1)); + } + private Page executeSpecWithSort(Sort sort) { flushTestUsers(); diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index 0d04d43c9..9a36e7ed5 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -178,4 +178,7 @@ public interface UserRepository extends JpaRepository, JpaSpecifi List findBySpringDataNamedQuery(String lastname); Page findByLastnameLike(Pageable pageable, String lastname); + + @Query("select u.lastname from User u group by u.lastname") + Page findWithGroupBy(Pageable pageable); }