Jestem nowy w Spring Data JPA i mam coś poniżej

        Page<Object> page = tableARepository.findAll(
                (root, criteriaQuery, criteriaBuilder) -> criteriaQuery
                        .where(sortConfig.getPredicateList(root, criteriaQuery, criteriaBuilder))
                        .groupBy(root.get("colB"))
                        .getRestriction(),
                sortConfig.getPageable()
        );

Wszystko jest poprawne z wyjątkiem page.getTotalElements(), które zwracają nieprawidłową liczbę, a także odkryłem, że zwraca liczbę bez groupBy.

Potrzebuję page.getTotalElements(), aby wyświetlić łączną liczbę wierszy dla interfejsu użytkownika, a obecnie rozwiązaniem było ponowne wysłanie zapytania do niego i uzyskanie rozmiaru wyniku, co nie jest zbyt ładne (witryna wciąż jest w fazie rozwoju) .

Wydrukowałem również zapytanie hibernacji sql, a zapytanie zliczające wybór zawierało groupBy, ale nie jestem pewien, co spowodowało, że zwróciło nieprawidłową wartość.

Załóżmy, dane tabeliA jak poniżej:

ColA  | ColB | ...
1       A
2       B
3       B
4       C
5       D

A po groupBy Powinienem mieć wynik i policzyć poniżej

ColA  | ColB | ...
1       A
2       B
4       C
5       D

TotalCount: 4

Ale jakoś mam 5, ktoś może pomóc?

UWAGA: SortConfig został opracowany przez mojego kolegę, aby używać go do celów paginacji.

EDYTOWAĆ:

select
    count(tblA_.tableA_ID) as col_0_0_ 
from
    tableA tblA_ 
where
    tblA_.tableAColC like ? 
group by
    tblA_.tableAColB
1
Chan Chun Weng 20 listopad 2019, 13:44
Można zaktualizować pytanie za pomocą zapytania sql wygenerowanego przez hibernację
 – 
Rajendra Gupta
20 listopad 2019, 13:49
Też co masz na myśli, że masz 5 liczyć? czy możesz wysłać zestaw wyników, który jest zwracany? może to prosty problem z danymi?
 – 
AntJavaDev
21 listopad 2019, 04:30
Zrobiłem where ColC like abc zwróci 43 wiersze i 43 liczbę, po czym dodałem groupBy colB, zwróci 33 wiersze i 43 liczbę.
 – 
Chan Chun Weng
21 listopad 2019, 05:39
Ooh teraz mam twój problem!?! nie mogę odgadnąć niczego innego oprócz tych dwóch linków tutaji tutaj, jako rozwiązanie sugerowałbym użycie zapytania natywnego lub oryginalnego zapytania JPA (nie kryterialnego) oraz pobierz całkowitą liczbę z zestawu wyników, a nie z elementu paginacji, sprawdź tę odpowiedź. Również jako odnośnik z 2 linków, której wersji danych wiosennych używasz?
 – 
AntJavaDev
21 listopad 2019, 09:27
TAK! to jest to, z czym mam obecnie do czynienia. Więc to był błąd i dzięki za linki sprawdzę te. Używam spring data jpa 2.1.10.RELEASE i spring boot 2.1.8.RELEASE.
 – 
Chan Chun Weng
21 listopad 2019, 10:14

3 odpowiedzi

Sprawdź obiekt, który można stronicować, jeśli indeksuje od zera. Coś jak:

Pageable pageable = new PageRequest(pageId-1, size); 
0
tksilicon 21 listopad 2019, 05:09
Sprawdź implementację sortConfig. W tym tkwi problem. Jeśli możesz wkleić część zajęć, która ma związek z paginacją.
 – 
tksilicon
21 listopad 2019, 07:09

Potwierdzono, że był to błąd w Pageable na podstawie komentarzy @AntJavaDev.

Na razie zmieniłem na podejście PageImpl, które znalazło tutaj i zadziałało Świetnie.

0
Chan Chun Weng 26 listopad 2019, 11:02

Użyj @EnableJpaRepositories do zdefiniowania repositoryBaseClass, zrobiłem to w klasie config w pakiecie potomnym.

    @Configuration
    @EnableJpaRepositories(
            repositoryBaseClass = SimpleJpaRepositoryEvenForGroupBy.class,
            value = "com.company.repository"
    )
    public class JpaConfig {
    }

Napisz własne executeCountQuery

    /**
     * A SimpleJpaRepository where COUNT returns the right number of rows even for GROUP BY queries.
     */
    public class SimpleJpaRepositoryEvenForGroupBy<T, ID> extends SimpleJpaRepository<T, ID> {
    
        public SimpleJpaRepositoryEvenForGroupBy(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
            super(entityInformation, entityManager);
        }
    
        public SimpleJpaRepositoryEvenForGroupBy(Class<T> domainClass, EntityManager em) {
            super(domainClass, em);
        }
    
        /**
         * Exactly the same method as in SimpleJpaRepository, but this calls the executeCountQuery of this class
         */
        @Override
        protected <S extends T> Page<S> readPage(TypedQuery<S> query, final Class<S> domainClass, Pageable pageable,
                                                 @Nullable Specification<S> spec) {
    
            if (pageable.isPaged()) {
                query.setFirstResult((int) pageable.getOffset());
                query.setMaxResults(pageable.getPageSize());
            }
    
            return PageableExecutionUtils.getPage(query.getResultList(), pageable,
                    () -> executeCountQuery(getCountQuery(spec, domainClass)));
        }
    
        /**
         *  An executeCountQuery where COUNT returns the right number of rows even for GROUP BY queries.
         */
        private static long executeCountQuery(TypedQuery<Long> query) {
            Assert.notNull(query, "TypedQuery must not be null!");
    
            List<Long> resultList = query.getResultList();
            if (resultList.size() == 1) {
                return resultList.get(0);
            }
    
            return resultList.size();
        }
    }
0
Camilo Uribe 19 październik 2021, 22:43