4 回答

TA貢獻1777條經驗 獲得超3個贊
您可以使用規范來實現這一目標。規范類類似于(假設 a、b 是文本列):
public class LocationSpecification implements Specification<Location> {
? ? public LocationSpecification(final List<String> listA, final List<String> listB) {
? ? ? ? this.listA = listA;
? ? ? ? this.listB = listB;
? ? }
? ? private final List<String> listA;
? ? private final List<String> listB;
? ? @Override
? ? public Predicate toPredicate(Root<Location> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
? ? ? ? List<Predicate> predicates = new ArrayList<>();
? ? ? ? if (listA != null) {
? ? ? ? ? ? predicates.add(root.<String>get("a").in(listA));
? ? ? ? }
? ? ? ? if (listB != null) {
? ? ? ? ? ? predicates.add(root.<String>get("b").in(listB));
? ? ? ? }
? ? ? ? return cb.and(predicates.toArray(new Predicate[0]));
? ? }
}
存儲庫需要擴展JpaSpecificationExecutor
public?interface?LocationRepository? ??extends?JpaRepository<Location,?Long>,?JpaSpecificationExecutor<Location>?{}
你會這樣稱呼它:
List<Location>?results?=?repository.findAll(new?LocationSpecification(listA,?listB));
PS 上面寫的是我的頭頂,可能需要一些修改。

TA貢獻1821條經驗 獲得超5個贊
在Criteria API?/?Specifications?/?Querydsl之間有一個很好的概述/比較。另一個庫是Jooq,它有免費版本。
解決問題的方法是使用其中之一。
我更喜歡 Querydsl 因為
它是類型安全的
它與 Spring Data 配合良好
您可以使用 IDE 中的代碼完成功能
您還應該考慮到(目前)Querydsl 維護得不好。
添加回答
舉報