Sie können Spezifikationen verwenden, die Frühlings-Daten, die Sie aus dem Kasten heraus gibt. und in der Lage sein, API verwenden Kriterien Abfragen programmatically.To Unterstützung Spezifikationen bauen Sie Ihre Repository-Schnittstelle mit dem JpaSpecificationExecutor Schnittstelle erweitern können
public interface CustomerRepository extends SimpleJpaRepository<T, ID>, JpaSpecificationExecutor {
}
Die zusätzliche Schnittstelle (JpaSpecificationExecutor) trägt Methoden, mit denen Sie Daten in einer Vielzahl von auszuführen Wege.
Zum Beispiel wird die findAll Methode alle Objekte zurück, die die Spezifikation entsprechen:
List<T> findAll(Specification<T> spec);
Die Spezifikation Schnittstelle ist wie folgt:
public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
CriteriaBuilder builder);
}
Okay, so was ist der typische Anwendungsfall? Spezifikationen können leicht verwendet werden, um eine erweiterbare Gruppe von Prädikaten über einer Entität zu erstellen, die dann mit JpaRepository kombiniert und verwendet werden kann, ohne dass eine Abfrage (Methode) für jede benötigte Kombination deklariert werden muss. Hier ein Beispiel: Beispiel 2.15. Spezifikationen für einen Kunden
public class CustomerSpecs {
public static Specification<Customer> isLongTermCustomer() {
return new Specification<Customer>() {
public Predicate toPredicate(
Root<Customer> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
LocalDate date = new LocalDate().minusYears(2);
return builder.lessThan(root.get('dateField'), date);
}
};
}
public static Specification<Customer> hasSalesOfMoreThan(MontaryAmount value) {
return new Specification<Customer>() {
public Predicate toPredicate(
Root<T> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
// build query here
}
};
}
}
Sie äußerten einige Kriterien auf einer Abstraktionsebene Geschäftsanforderungen und erstellt ausführbare Spezifikationen. So könnte ein Client eine Spezifikation wie folgt verwenden:
List customers = customerRepository.findAll(isLongTermCustomer());
Sie auch 2,17 Spezifikation Beispiel kombinieren. Kombinierte Spezifikationen
MonetaryAmount amount = new MonetaryAmount(200.0, Currencies.DOLLAR);
List<Customer> customers = customerRepository.findAll(
where(isLongTermCustomer()).or(hasSalesOfMoreThan(amount)));
Wie Sie sehen können, Spezifikationen bietet einige Kleber-Code Methoden zur Ketten und Spezifikationen kombinieren. Daher ist die Erweiterung Ihrer Datenzugriffsschicht nur eine Frage der Erstellung neuer Spezifikationen Implementierungen und kombiniert sie mit denen bereits vorhandenen.
Und Sie komplexe Daten erstellen kann, ist hier ein Beispiel
public class WorkInProgressSpecification {
public static Specification<WorkInProgress> findByCriteria(final SearchCriteria searchCriteria) {
return new Specification<WorkInProgress>() {
@Override
public Predicate toPredicate(
Root<WorkInProgress> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
if (searchCriteria.getView() != null && !searchCriteria.getView().isEmpty()) {
predicates.add(cb.equal(root.get("viewType"), searchCriteria.getView()));
}
if (searchCriteria.getFeature() != null && !searchCriteria.getFeature().isEmpty()) {
predicates.add(cb.equal(root.get("title"), searchCriteria.getFeature()));
}
if (searchCriteria.getEpic() != null && !searchCriteria.getEpic().isEmpty()) {
predicates.add(cb.equal(root.get("epic"), searchCriteria.getEpic()));
}
if (searchCriteria.getPerformingGroup() != null && !searchCriteria.getPerformingGroup().isEmpty()) {
predicates.add(cb.equal(root.get("performingGroup"), searchCriteria.getPerformingGroup()));
}
if (searchCriteria.getPlannedStartDate() != null) {
System.out.println("searchCriteria.getPlannedStartDate():" + searchCriteria.getPlannedStartDate());
predicates.add(cb.greaterThanOrEqualTo(root.<Date>get("plndStartDate"), searchCriteria.getPlannedStartDate()));
}
if (searchCriteria.getPlannedCompletionDate() != null) {
predicates.add(cb.lessThanOrEqualTo(root.<Date>get("plndComplDate"), searchCriteria.getPlannedCompletionDate()));
}
if (searchCriteria.getTeam() != null && !searchCriteria.getTeam().isEmpty()) {
predicates.add(cb.equal(root.get("agileTeam"), searchCriteria.getTeam()));
}
return cb.and(predicates.toArray(new Predicate[] {}));
}
};
}
}
Hier ist die JPA Respositories docs
Wir haben 3.2.5 Version zu diesem Zeitpunkt. – EpicPandaForce
Es gab auch eine Anleitung zu diesem Thema hier (zusätzliche Informationen zum Testen, zum Beispiel): http: //www.petrikainulainen.net/programming/spring-framework/feder-daten-jpa-tutorial-part-five-querydsl/und ursprünglich hier: http://spring.io/blog/2011/04/26/advanced-spring-data-jpa- specifications-and-querydsl/ – EpicPandaForce
Excellent .. Es funktioniert ganz gut .. Ich wusste nicht von 'BooleanBuilder' .. Nach einem guten Beispiel damit, Jetzt kam zu wissen, was Querydsl tun kann .. Danke für Ihre wertvolle Zeit .. –