2016-12-14 62 views
1

如何在Spring数据中使用至少三个参数之一编写JPA查询?在WHERE条件中使用参数组合的Spring JPA自定义查询?

我有以下三个参数:

  1. ID(PK)
  2. 名称

客户必须提供这三个参数中的至少一个,我想找到用户通过这些非空参数。

是否可以创建这样的自定义查询到我的存储库或我必须创建所有可能的WHERE条件组合的自定义查询?

+0

使用自定义存储库方法,并使用JPA标准API动态生成您的查询。这就是它的目的。 –

+0

谢谢,我会看看它。 – Artegon

回答

0

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

你不会那么写任何查询方法:

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

您还可以使在一个Spring MVC控制器自动绑定的谓语这里详述:

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个参数作为请求参数传递,而无需编写任何代码。

+0

嗯,它看起来很有趣。 – Artegon

0

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

在您的应用程序代码中,您应该根据输入DTO中每个上述属性是否为空来构建谓词。

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

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

有一点要记住的是,上述两种方法是适当的地方,这是没有必要做一个加入

在这里你的要求似乎是一个单一的表查询,所以任何一个的取景器方法应该足够了。

如果您确实需要与其他表进行连接,并且需要对JOIN的发生方式进行细化控制(INNER JOIN vs LEFT OUTER JOIN vs CROSS JOIN)等,那么您应该考虑创建一个定制存储库,延伸。 然后提供您现在可以从存储库访问的customImpl。

0

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

相关问题