亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據函數的輸出在@Query 中使用查詢字符串

如何根據函數的輸出在@Query 中使用查詢字符串

臨摹微笑 2023-06-21 15:52:19
我正在嘗試使用 @Query 注釋進行查詢并且它工作得很好,因為它總是只有一個條件,但現在我有多個條件并且我希望我的查詢字符串根據參數動態更改。假設我有 2 個字符串列表,listA 和 listB 我希望我的查詢是@Query("SELECT l FROM location AS l WHERE l.a IN :listA")當listA不為空且listB為空時,并且@Query("SELECT l FROM location AS l WHERE l.b IN :listB")當 listB 不為空且 listB 為空時,并且@Query("SELECT l FROM location AS l WHERE l.a IN :listA) AND l.b IN :listB"當兩個列表都不為空時。我一直在嘗試查看是否可以從其他函數獲取查詢字符串。我可以根據列表生成字符串,但我只是不知道如何將輸出字符串放入 @Query() 中,因為它位于存儲庫接口中。
查看完整描述

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 上面寫的是我的頭頂,可能需要一些修改。


查看完整回答
反對 回復 2023-06-21
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

使用JPA Specification API?


查看完整回答
反對 回復 2023-06-21
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

您不必總是依賴@Query 來執行查詢。更好的選擇是創建存儲過程并根據您的條件以編程方式調用它們。或者使用 Criteria 動態生成查詢


查看完整回答
反對 回復 2023-06-21
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

Criteria API?/?Specifications?/?Querydsl之間有一個很好的概述/比較。另一個庫是Jooq,它有免費版本。

解決問題的方法是使用其中之一。

我更喜歡 Querydsl 因為

  • 它是類型安全的

  • 它與 Spring Data 配合良好

  • 您可以使用 IDE 中的代碼完成功能

您還應該考慮到(目前)Querydsl 維護得不好。


查看完整回答
反對 回復 2023-06-21
  • 4 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號