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?!

InformationsquelleAutor smeeb | 2018-02-06
Schreibe einen Kommentar