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 przezJpaSpecificationExecutor
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żeniaJPARepository
.
Miałbyś więc możliwość wstrzyknięciaEntityManager
i użyćCriteria
API.