Problem z paginacją w zapytaniu JPA w Spring Boot

Problem z paginacją w zapytaniu JPA w Spring Boot
FG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Cześć,

Stworzyłem endpoint w Spring Boot do pobierania listy użytkowników. Gdy użytkownik zaczyna wpisywać dane, wartość jest przekazywana do metody:

Kopiuj
public List<ClientEntity> getClientBySearchValue(String value) {

    String firstPart = "", secondPart = "";
    String trimmedInput = value.trim();
    String[] parts = trimmedInput.split("\\s+");

    if (parts.length >= 2) {
        firstPart = parts[0];
        secondPart = parts[1];
    }
    return clientRepository.searchClientsByValue(trimmedInput, firstPart, secondPart));
}

Następnie zapytanie jest wykonywane w bazie przy pomocy JPA:

Kopiuj
@Query("SELECT r FROM ClientEntity r " +
        "WHERE (" +
        "(LOWER(r.name) LIKE LOWER(CONCAT('%', :firstPart, '%')) AND " +
        "LOWER(r.surname) LIKE LOWER(CONCAT('%', :secondPart, '%'))) OR " +
        "LOWER(r.name) LIKE LOWER(CONCAT('%', :value, '%')) OR " +
        "LOWER(r.surname) LIKE LOWER(CONCAT('%', :value, '%')) OR " +
        "r.phone LIKE CONCAT('%', :value, '%'))")
List<ClientEntity> searchClientsByValue(
        String value,
        String firstPart,
        String secondPart
);

Zapytanie zwraca poprawną listę użytkowników, jednak chciałbym ograniczyć wynik do maksymalnie 50 rekordów. Próbowałem dodać Pageable , ale wtedy metoda działa niepoprawnie, zwracając dziwne rekordy.

Czy ktoś wie, dlaczego tak się dzieje? Może ktoś ma propozycje, jak lepiej rozwiązać ten problem?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
1

https://www.baeldung.com/jpa-limit-query-results

Zobacz w logach, jaki SQL jest generowany - pomoże w debugowaniu.

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
0

W przypadku kiedy chcesz sztywny limit po prostu dopisz LIMIT 1 na końcu. Pisząc własne zapytanie musisz sam obsłużyć paginacje, gdybyś chciał użyć Pageable. Choć ogólnie sugeruje korzystać z CriteriaBuilder.

ZC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
1

@hzmzp w zapytaniach JPQL LIMIT 1 na końcu nie zadziała.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
0

A zrób to przez Specification, dodaj do findAll ją i odpowiedni Pageable

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.