使用 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_list 上的过滤器只有 return 是真实的 BooleanExpression/Predicate 如果实际 KV-存在。

示例:

KV_list table 包含以下记录:

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

虽然您希望上面的 GET 请求能够正常工作,但以下应该不会 return 任何东西,因为 KV 对不存在:

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

1 不幸的是,querydsl 只是检查是否有 key=KEY2 AND a value=NNN 然后 return是一个真实的谓词。

模型看起来像: Parent <--1:n--> ChildEntity <--1:n--> KV_Entity

到目前为止我尝试了什么

我真的被卡住了,非常感谢 help/hints。 提前致谢!


frameworks/libraries 正在使用:


我不知道你的问题的完整背景。 也许你可以创建一个虚拟密钥(哈希)。

包含var_keyvar_value

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