Spring JPA自定义查询与WHERE条件中的参数组合?

时间:2016-12-14 17:03:29

标签: spring jpa spring-data

如何在使用至少三个参数之一的Spring Data中编写JPA查询?

我有以下三个参数:

  1. Id(PK)
  2. 名称
  3. 客户端必须提供这三个参数中的至少一个,并且我希望通过这些非空参数找到用户。

    是否可以为我的存储库创建此类自定义查询,或者是否必须为WHERE条件的所有可能组合创建自定义查询?

3 个答案:

答案 0 :(得分:0)

您可以让您的存储库扩展org.springframework.data.querydsl.QueryDslPredicateExecutor并使用继承的findAll(Predicate谓词)方法来使用任何参数组合进行查询。

您不必编写任何查询方法:

http://docs.spring.io/spring-data/jpa/docs/1.10.5.RELEASE/reference/html/#core.extensions.querydsl

您也可以在Spring MVC Controller中自动绑定谓词,如下所示:

https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support

在这里:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web.type-safe

因此,您的控制器可以自动处理1,2或全部3个参数作为请求参数传递的搜索,而无需编写任何代码。

答案 1 :(得分:0)

这是您需要能够在运行时创建动态查询的地方。

在您的应用程序代码中,您应该具有基于输入DTO中的每个上述属性是否为空来构建谓词的逻辑。

一种方法是使用QueryDSL。 要使用QueryDSL,您应该在pom / gradle文件中包含相关的依赖项,然后您的存储库应该扩展QueryDslPredicateExecutor接口。这将为您提供两种额外的通用查找器方法。

T findAll(Predicate) or Page<T> findAll(Predicate, Pageable)

要记住的一点是,上述两种方法适用于不需要进行连接的方法

这里的要求似乎是单个表查询,因此任何一个finder方法都应该足够了。

如果你确实需要与其他表连接并且需要对JOIN如何发生(INNER JOIN vs LEFT OUTER JOIN vs CROSS JOIN)等进行细粒度控制,那么你应该考虑创建一个你的存储库可以扩展的自定义存储库。 然后提供您自己可以从存储库访问的customImpl。

答案 2 :(得分:0)

非常感谢回复...因为我读到Spring并不像其他框架那样灵活...因为我尝试了一些节点js api框架,它更容易,更灵活..你怎么看待这个?