JPA-Spezifikationen von Beispiel
Spring Boot hier. Ich bin versucht zu wickeln meinem Kopf herum JpaRepositories
und Specifications
wenn diese im Zusammenhang mit der Umsetzung komplexer Abfragen und bin kämpfen, um zu sehen, den "Wald durch die Bäume" auf mehreren Positionen.
Eine kanonische Beispiel für eine Specification
ist wie folgt:
public class PersonSpecification implements Specification<Person> {
private Person filter;
public PersonSpecification(Person filter) {
super();
this.filter = filter;
}
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq,
CriteriaBuilder cb) {
Predicate p = cb.disjunction();
if (filter.getName() != null) {
p.getExpressions()
.add(cb.equal(root.get("name"), filter.getName()));
}
if (filter.getSurname() != null && filter.getAge() != null) {
p.getExpressions().add(
cb.and(cb.equal(root.get("surname"), filter.getSurname()),
cb.equal(root.get("age"), filter.getAge())));
}
return p;
}
}
In diesem toPredicate(...)
Methode, was die Root<Person>
und CriteriaQuery
darstellen? Am wichtigsten ist, es klingt, wie Sie brauchen, um eine zu erstellen Specification
impl für jeder Art von filter, den Sie anwenden möchten, weil jeder spec wird übersetzt in ein und nur ein Prädikat...so zum Beispiel, wenn ich wollte, alle Menschen mit dem Familiennamen der "Smeeb" und einem Alter von mehr als 25, es klingt, als hätte ich schreiben müssen, ein LastnameMatchingSpecification<Person>
sowie eine AgeGreaterThanSpecification<Person>
. Kann das jemand bestätigen oder klären Sie das für mich?!
- check out diese Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Root
ist die Wurzel Ihrer Abfrage, im Grunde Was Sie Abfragen, für. In einemSpecification
Sie könnten es verwenden, um reagieren dynamisch auf diese. Dies würde ermöglichen es Ihnen, zum Beispiel, zu bauenOlderThanSpecification
zu handhabenCar
s mit einemmodelYear
undDrivers
mit einemdateOfBirth
durch die Erkennung der Art und mit der entsprechenden Eigenschaft.Ähnlich
CriteriaQuery
ist die vollständige Abfrage, die Sie wieder verwenden könnte, um Sie zu inspizieren und anzupassen, die das Prädikat Sie bauen auf Ihr basiert.Ich glaube, Sie haben das falsch verstanden. Der Spring-Data interfaces akzeptieren
Specification
s akzeptiert nur einen einzigenSpecification
. Also, wenn Sie wollen, finden Sie allePerson
s mit einem bestimmten Namen und einem bestimmten Alter sind, erstellen Sie eineSpecification
. Ähnlich wie das Beispiel, das Sie nennen, die auch kombiniert zwei Einschränkungen.Aber Sie können erstellen Sie separate
Specification
s und erstellen Sie dann eine weitere eine Kombination von diesen, wenn Sie möchten, verwenden Sie jeweils separat, aber auch kombiniert.Dies war für mich schwer zu auf den ersten, aber jetzt mache ich dynamische Abfragen mit Leichtigkeit und einer einzigen Spezifikation pro Tabelle (bei der Erweiterten Suche notwendig ist)
Denke, diese Objekte wie:
--
Beginnen Sie immer mit einer Liste dann verdichten Sie am Ende entweder mit UND/ODER Bedingungen, die auf der Grundlage Ihrer Bedürfnisse.
Nun meine user weitergeben können jede Kombination dieser 3 Felder hier und diese Logik würde dynamisch die Abfrage erstellen um Bedingungen für Sie.
z.B.
name = John und Nachname = Mustermann und Alter = 41
oder
name = John und Alter = 41
oder
name = John
etc.
Schließlich, bei der Suche Saiten würde ich empfehlen, mit cb.wie und nicht cb.gleich so, dass Sie Ihre Suche in der Lage teilweise die Suche mit % übergeben wird, die von Benutzer-oder frontend-system.
Im Hinterkopf behalten cb.wie ist die groß-und Kleinschreibung nicht per default muss verwendet werden in Verbindung mit cb.niedriger oder cb.oberen wie:
Hoffe, das hilft !