繁体   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