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
3 odpowiedzi
Sprawdź obiekt, który można stronicować, jeśli indeksuje od zera. Coś jak:
Pageable pageable = new PageRequest(pageId-1, size);
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.
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();
}
}
Podobne pytania
Powiązane pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
where ColC like abc
zwróci 43 wiersze i 43 liczbę, po czym dodałemgroupBy colB
, zwróci 33 wiersze i 43 liczbę.