JpaSpecificationExecutor JOIN +, UM DURCH die in der Spezifikation
Ich habe eine Abfrage mit einem JOIN und ORDER BY und möchte es in meinem repository unter Verwendung der Kriterien-Api.
Hier fand ich, wie wickeln Sie eine solche Abfrage in einer CriteriaQuery (Link).
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = cq.join(Pet_.owners);
cq.select(pet);
cq.orderBy(cb.asc(owner.get(Owner_.lastName),owner.get(Owner_.firstName)));
Auf der anderen Seite, fand ich einige Beispiele zur Verwendung der Kriterien-Api in Kombination mit einer JpaRepository (Beispiel).
Das Problem ist, dass alle Methoden, die im repository erwarten Spezifikation:
T findOne(Specification<T> spec);
die bauen immer so:
public static Specification<PerfTest> statusSetEqual(final Status... statuses) {
return new Specification<PerfTest>() {
@Override
public Predicate toPredicate(Root<PerfTest> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.not(root.get("status").in((Object[]) statuses));
}
};
}
Also auf der einen Seite weiß ich, wie man erstellen Sie eine CriteriaQuery, und auf der anderen Seite brauche ich eine Spezifikation, die aufgebaut ist aus einem Prädikat, und ich kann nicht herausfinden, wie zu analysieren, die CriteriaQuery in eine Spezifikation/Prädikat.
InformationsquelleAutor aschi | 2016-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, so etwas wie dieses (ich nahm Haustier hat viele Besitzer):
Dies ist nur ein Beispiel Suche alle Haustiere, deren mindestens einen Besitzer hat den Namen gleich ownerName
Aber man könnte hinzufügen, eine Methode
List<Pet> findByOwnersNameOrderByIdDesc(String ownerName);
im repository statt (als äquivalent zur Spezifikation).InformationsquelleAutor Jakub Bibro