/ / Filtruj repozytorium JPA według wielu opcjonalnych parametrów - java, spring-mvc, spring-boot, spring-data-jpa

Filtruj repozytorium JPA według wielu opcjonalnych parametrów - java, spring-mvc, spring-boot, spring-data-jpa

Mam prostą usługę REST, która zwraca encję profilu użytkownika, która ma około 20 pól.

Muszę wdrożyć funkcję filtrowania danych tam, gdzie wymagane jest nazwisko, ale wszystkie inne pola (imię, wiek, miasto, stan, kod pocztowy itp.) Są opcjonalne.

Czy można to zrobić za pomocą JpaRepository bez tworzenia wielu if/else instrukcje dla każdej kombinacji wzorów?

Odpowiedzi:

0 dla odpowiedzi № 1
  • Zawsze najlepiej jest zwrócić reprezentację DTO obiektu w Odpowiedź REST.
  • W swoim DTO możesz mapować tylko wymagane pola od encji i zignoruj ​​inne parametry opcjonalne.

Sprawdź to http://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application


0 dla odpowiedzi nr 2

Jest to przypadek użycia dla Kryteria WZP (dostępne od JPA2).
W rzeczy samej, gdy chcesz napisać zapytanie dynamiczne, przede wszystkim nie chcesz na stałe wpisywać kodu JPQL zapytania dla każdej kombinacji i nie chcesz łączyć fragmentów JPQL ponieważ jest to podatne na błędy i nie jest sprawdzane podczas kompilacji.

Pamiętaj, że w każdym przypadku (Criteria lub JPQL), powinieneś sprawdzić każdą możliwą opcję, jeśli klient ją określił, aby móc ją uwzględnić w kompilacji zapytania.

Teraz, gdy wdrażasz JPARepository interfejs masz dwa sposoby:

  • za pomocą List<T> findAll(@Nullable Specification<T> spec); dostarczone przez JpaSpecificationExecutor interfejs, który można również zaimplementować w niestandardowym repozytorium.

  • Wzbogacić JPARepository z własnym interfejsem, który definiuje metodę findAll() i który przyjmuje jako parametr obiekt zawierający wartości do badań.
    Następnie utwórz konkretną klasę do wdrożenia JPARepository.
    Miałbyś więc możliwość wstrzyknięcia EntityManager i użyć Criteria API.