我可以在 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<T> spec)
List<T> findAll(Specification<T> spec)
Page<T> findAll(Specification<T> spec, Pageable pageable)
List<T> findAll(Specification<T> spec, Sort sort)
T findOne(Specification<T> spec)
因此,您不能将@Query
定义与Specification
混合使用。
但是,由于您可以使用 Specification
来表达 firstName <> ?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 存储库 - 实体列名称上的下划线
在 JPA 存储库(Spring Data Jpa)中执行自定义查询