Przeglądanie metod za pomocą metod i readPage(TypedQuery, Pageable, Specification)
. Wydaje realizacja sprężyny jest zawsze wykonywać kwerendy policzyć i sprawdzić czy startIndex jest poza zakresem przed wykonaniem kwerendy wybierającej:
protected Page<T> readPage(TypedQuery<T> query, Pageable pageable, Specification<T> spec) {
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
Long total = QueryUtils.executeCountQuery(getCountQuery(spec));
List<T> content = total > pageable.getOffset() ? query.getResultList() : Collections.<T> emptyList();
return new PageImpl<T>(content, pageable, total);
}
nie wierzę, to jest zawsze najlepsza praktyka. W moim przykładzie użycia, na przykład, z przyjemnością wykonamy kwerendę raz z góry, a nie w kolejnych wywołaniach, ponieważ wiemy, że nowe dane nie pojawiają się wystarczająco często, aby zagwarantować aktualizację licznika, a kwerenda licznika jest bardzo kosztowna do wykonania.
Byłoby wspaniale, gdyby Spring Data mogła dostarczyć flagę lub alternatywną metodę wyłączenia liczenia dla zapytania o kryteria, podobną do simple find queries.
W tym czasie, oto moja praca wokół rozwiązanie:
Załóż wewnętrzną klasę, która podklasy SimpleJpaRepository. Zastąp readPage, aby wyłączyć zapytanie o liczenie. Utwórz DAO, dodaj adnotację do @Repository i stwórz instancję klasy wewnętrznej, aby przekazać odpowiedni EntityManager. Wreszcie wstrzykiwać tej DAO gdziekolwiek kryteria wyszukiwania „no-count” ma zastosowanie:
@Repository
public class CriteriaNoCountDao {
@PersistenceContext
protected EntityManager em;
public <T, ID extends Serializable> Page<T> findAll(Specification<T> spec, Pageable pageable, Class<T> clazz){
SimpleJpaNoCountRepository<T, ID> noCountDao = new SimpleJpaNoCountRepository<T, ID>(clazz, em);
return noCountDao.findAll(spec, pageable);
}
/**
* Custom repository type that disable count query.
*/
public static class SimpleJpaNoCountRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> {
public SimpleJpaNoCountRepository(Class<T> domainClass, EntityManager em) {
super(domainClass, em);
}
/**
* Override {@link SimpleJpaRepository#readPage(TypedQuery, Pageable, Specification)}
*/
protected Page<T> readPage(TypedQuery<T> query, Pageable pageable, Specification<T> spec) {
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
List<T> content = query.getResultList();
return new PageImpl<T>(content, pageable, content.size());
}
}
}
możliwe duplikat [? Sposób wyłączania zapytanie liczyć od PageRequest uzyskania całkowitą liczbę stron] (http://stackoverflow.com/questions/ 12644749/sposób-wyłączyć-liczenie-zapytań-od-strony-żądania-do-całkowitych-stron) – mttdbrd
Ta odpowiedź wydaje się być dostępna tutaj: http://stackoverflow.com/questions/12644749/way-to-disable- count-query-from-pagerequest-for-getting-total-pages? rq = 1 – mttdbrd
Niezupełnie. Szukam rozwiązania dla Specification a.k.a search kryteriów. Czytając SimpleJpaRepository.findAll (spec, pageable), wygląda na to, że implementatorzy uważają, że zapytanie zliczające powinno zawsze być wykonywane najpierw, a jeśli plasterek jest poza zakresem, to nie wykona kwerendy wyboru. Nie wierzę, że liczenie zapytań zawsze jest mniej kosztowne. –