Ich habe einen einfachen REST-Dienst, der eine Benutzerprofilentität mit etwa 20 Feldern zurückgibt.
Ich muss eine Funktion implementieren, um die Daten zu filtern, bei denen der Nachname erforderlich ist. Alle anderen Felder (Vorname, Alter, Ort, Bundesland, Postleitzahl usw.) sind jedoch optional.
Gibt es eine Möglichkeit, dies zu tun? JpaRepository
ohne viel zu schaffen if
/else
Aussagen für jede einzelne Kombination von Patamentierern?
Antworten:
0 für die Antwort № 1- Es ist immer am besten, eine DTO-Darstellung einer Entität in der Antwort auf REST.
- In Ihrem DTO können Sie nur erforderliche Felder von einer Entität und zuordnen ignorieren Sie andere optionale Parameter.
Sieh dir das an http://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application
0 für die Antwort № 2
Es ist ein Anwendungsfall für JPA-Kriterien (verfügbar seit JPA2).
In der Tat, wenn Sie eine dynamische Abfrage schreiben möchten, möchten Sie vor allem nicht fest codiert JPQL
Abfragen für jede Kombination und Sie möchten keine verketteten Brocken von JPQL
Entweder ist dies fehleranfällig und wird zur Kompilierzeit nicht geprüft.
Beachten Sie, dass auf jeden Fall (Criteria
oder JPQL
) Sie sollten für jede mögliche Option prüfen, ob der Client sie angegeben hat, um sie bei der Abfrageerstellung berücksichtigen zu können.
Nun, wie Sie das implementieren JPARepository
Schnittstelle haben Sie zwei Möglichkeiten:
verwenden
List<T> findAll(@Nullable Specification<T> spec);
zur Verfügung gestellt von derJpaSpecificationExecutor
Schnittstelle, die Sie auch in Ihrem benutzerdefinierten Repository implementieren können.Bereichern Sie die
JPARepository
mit Ihrer eigenen Schnittstelle, die eine Methode definiertfindAll()
und das nimmt als Parameter ein Objekt, das Werte für die Forschung enthält.
Dann erstellen Sie eine konkrete Klasse, die implementiert werden sollJPARepository
.
Du hättest also die Möglichkeit, das zu spritzenEntityManager
und das zu benutzenCriteria
API.