如何在使用至少三个参数之一的Spring Data中编写JPA查询?
我有以下三个参数:
客户端必须提供这三个参数中的至少一个,并且我希望通过这些非空参数找到用户。
是否可以为我的存储库创建此类自定义查询,或者是否必须为WHERE
条件的所有可能组合创建自定义查询?
答案 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框架,它更容易,更灵活..你怎么看待这个?