4 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
您可以使用規(guī)范來實現(xiàn)這一目標。規(guī)范類類似于(假設(shè) 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貢獻1862條經(jīng)驗 獲得超7個贊
您不必總是依賴@Query 來執(zhí)行查詢。更好的選擇是創(chuàng)建存儲過程并根據(jù)您的條件以編程方式調(diào)用它們?;蛘呤褂?Criteria 動態(tài)生成查詢

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