簡體   English   中英

使用Querydsl篩選鍵值對

[英]Filter for Key-Value pairs using Querydsl

我的問題需要一些解釋。 我盡力使它盡可能短,而不會遺漏重要方面。 因此,已經感謝所有讀完這篇文章的人。

我試圖實現的目標

使用幾個查詢參數作為過濾器執行GET請求

api/parentResource?areaCode=11&childEntity.kvlist.API_KEY=123CBA321

這個例子請求將檢索列表parentResource屬於某個特定區域,並有鍵值對API_KEY=123CBA321在他們的孩子實體的名單(名單本身也是子實體的子實體,為了簡便起見我們稱之為KV_list )。

到目前為止,我使用Querydsl可以完成此工作,但是有一件事我無法解決自己:

問題在於 ,使用AND結合詞時querydsl的行為可能與預期的1相同 我需要實現的是,如果存在實際的KV 對,則KV_list上的過濾器僅返回真實的BooleanExpression / Predicate。

例:

KV_list表包含以下記錄:

+-------+-----------+-----------+---------------+
|  id   |    key    |   value   |  foreign_key  |
+-------+-----------+-----------+---------------+
| UUID1 | API_KEY   | 123CBA321 | childEntityFK |
| UUID2 | KEY2      | XYZ987    | childEntityFK |
| UUID3 | OTHER_KEY | NNN       | childEntityFK |
+-------+-----------+-----------+---------------+

盡管您希望上面的GET請求能夠正常工作,但是以下內容不應返回任何內容,因為KV對不存在:

api/parentResource?areaCode=11&childEntity.kvlist.KEY2=NNN

不幸的是1 ,querydsl只是檢查是否有一個key=KEY2 一個value=NNN ,然后返回一個真實的謂詞。

該模型如下所示: Parent <--1:n--> ChildEntity <--1:n--> KV_Entity

到目前為止我嘗試過的

  • 鍵和值的簡單結合:

      ExpressionUtils.allOf(this.predicate, QParent.parent.childEntities.any().kvEntities.any().key.eq(var_key), QParent.parent.childEntities.any().kvEntities.any().value.eq(var_value) ); 
  • 直接在KV對象上調用eq方法:

     ExpressionUtils.and(this.predicate, QParent.parent.childEntities.any().kvEntities.any()eq(var_kvObject) ); 
  • JPAExpressions.select()。from()。join()...

  • 上面提到的幾種方法

我真的很困,不勝感激。 提前致謝!


使用的框架/庫:

  • Spring Boot 2.0.4
  • Querydsl 4.1.4

我不知道您所提問題的全部內容。 也許您可以創建一個虛擬密鑰(哈希)。

包含var_keyvar_value

然后您可以使用QParent.parent.childEntities.any().kvEntities.any().hash.eq(hash)搜索kvEntities

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM