[英]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()...
上面提到的几种方法
我真的很困,不胜感激。 提前致谢!
使用的框架/库:
我不知道您所提问题的全部内容。 也许您可以创建一个虚拟密钥(哈希)。
包含var_key
和var_value
。
然后您可以使用QParent.parent.childEntities.any().kvEntities.any().hash.eq(hash)
搜索kvEntities
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.