我可以在 Spring Data JPA 存储库方法中将 @Query 定义与规范结合起来吗?

Posted

技术标签:

【中文标题】我可以在 Spring Data JPA 存储库方法中将 @Query 定义与规范结合起来吗?【英文标题】:Can I combine a @Query definition with a Specification in a Spring Data JPA repository method? 【发布时间】:2014-12-10 08:26:10 【问题描述】:

是否可以在一个存储库方法中同时使用@Query 注释和规范?例如我想要一个这样的方法:

@Query(value="SELECT e from EMPLOYEE where firstName <> ?1")
public Page<Employee> findEmployeeBySomethigFancy(String firstName, Pageable pageable, Specification<Employee> emp);

是否可以或应该将整个查询构建为 Predicate 并删除 @Query 注释?

【问题讨论】:

【参考方案1】:

首先,你应该阅读这个Spring blog post。

其次,根据您的存储库应实现的JpaSpecificationExecutor 接口,以下方法采用Specification 参数:

count(Specification&lt;T&gt; spec) List&lt;T&gt; findAll(Specification&lt;T&gt; spec) Page&lt;T&gt; findAll(Specification&lt;T&gt; spec, Pageable pageable) List&lt;T&gt; findAll(Specification&lt;T&gt; spec, Sort sort) T findOne(Specification&lt;T&gt; spec)

因此,您不能将@Query 定义与Specification 混合使用。

但是,由于您可以使用 Specification 来表达 firstName &lt;&gt; ?1 条件,并且您可以组合任意数量的规范,因此您可以仅使用 Specification(s) 重写整个 @Query

【讨论】:

感谢您的回复!我知道我可以组合任意数量的规范,但是我有几个带有 @Query 注释的方法,现在需要使用规范,所以我必须将现有查询重写为规范的对象.我认为也许有一种方法可以将 @Query 和 Specification 结合起来。 从 API 实施者的角度来看,分离这些关注点并提供特定的查询工具要容易得多。将它们结合起来可能会使实现更加复杂。 这个题目太棒了,我要在一个JPA查询方法上做多对多join,并且传递一个Specification和Pageable item。确保@Query 不能与它混合(我测试过)。这并没有给我的杯子带来任何答案。不知道如何设法让我的查询与关系表相对应,并保留我的规范和可分页项:( @Alex 您是否找到了解决您问题的方法?因为我有类似的情况,我不能同时结合查询和规范。如果您有任何解决方案,请帮助我们。 @AnshulKabra 这是很久以前的事了,但我记得最终使用 QueryBuilder 和 CriteriaAPI 来扩展我的 JpaRepository 并手动实现查询。接收 Pageable 和 Specification,我创建了整个查询和 Page 项。

以上是关于我可以在 Spring Data JPA 存储库方法中将 @Query 定义与规范结合起来吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Data-Jpa 存储库 - 实体列名称上的下划线

Spring -data-jpa ,存储库类不起作用

延迟加载 Spring Data JPA 存储库

在 JPA 存储库(Spring Data Jpa)中执行自定义查询

为什么Spring-Data-JPA Async无法正常工作?

spring-data-jpa 存储库模式与 Querydsl 查询模式有啥区别?