使用 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
到目前为止我尝试了什么
键和值的简单连接:
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()...
上述几种方法
我真的被卡住了,非常感谢 help/hints。
提前致谢!
frameworks/libraries 正在使用:
- Spring 启动 2.0.4
- Querydsl 4.1.4
我不知道你的问题的完整背景。
也许你可以创建一个虚拟密钥(哈希)。
包含var_key
和var_value
。
然后你可以使用
QParent.parent.childEntities.any().kvEntities.any().hash.eq(hash)
搜索 kvEntities
我的问题需要一些解释。我尽量在不遗漏重要方面的情况下使其尽可能简短。所以已经感谢所有阅读到最后的人。
我努力实现的目标
使用多个查询参数作为过滤器执行 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
到目前为止我尝试了什么
键和值的简单连接:
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()...
上述几种方法
我真的被卡住了,非常感谢 help/hints。 提前致谢!
frameworks/libraries 正在使用:
- Spring 启动 2.0.4
- Querydsl 4.1.4
我不知道你的问题的完整背景。 也许你可以创建一个虚拟密钥(哈希)。
包含var_key
和var_value
。
然后你可以使用
QParent.parent.childEntities.any().kvEntities.any().hash.eq(hash)
搜索 kvEntities