【发布时间】:2019-01-29 20:05:24
【问题描述】:
我的问题需要解释一下。我尽量保持简短而不会遗漏重要方面。所以已经感谢所有阅读到最后的人。
我想达到的目标
使用多个查询参数作为过滤器执行 GET 请求
api/parentResource?areaCode=11&childEntity.kvlist.API_KEY=123CBA321
示例请求将检索属于某个区域的parentResource 列表,并且在其子实体的列表中具有键值对API_KEY=123CBA321(列表本身也是子实体的子实体,例如简而言之,我们称之为 KV_list)。
到目前为止,我使用 Querydsl 完成了这项工作,但有一件事我自己无法解决:
问题是在使用 AND 连词时 querydsl 的行为可能与预期的一样1。 我需要实现的是,如果实际的 KV-pair 存在,则 KV_list 上的过滤器只会返回一个真实的 BooleanExpression/Predicate。 p>
例子:
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 AND 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-object上调用eq方法:
ExpressionUtils.and(this.predicate, QParent.parent.childEntities.any().kvEntities.any()eq(var_kvObject) ); JPAExpressions.select().from().join()...
上面提到的几种方法
我真的被困住了,如果有任何帮助/提示,我将不胜感激。 提前致谢!
正在使用的框架/库:
- Spring Boot 2.0.4
- 查询dsl 4.1.4
【问题讨论】:
标签: java spring-boot spring-data-jpa querydsl