使用Querydsl

时间:2018-08-23 12:30:36

标签: java spring-boot spring-data-jpa 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 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对象上调用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

1 个答案:

答案 0 :(得分:-1)

我不知道您所提问题的全部内容。 也许您可以创建一个虚拟密钥(哈希)。

其中包含var_keyvar_value

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