【问题标题】:Can I combine a @Query definition with a Specification in a Spring Data JPA repository method?我可以在 Spring Data JPA 存储库方法中将 @Query 定义与规范结合起来吗?
【发布时间】: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 注释?

【问题讨论】:

    标签: java spring hibernate jpa spring-data-jpa


    【解决方案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 项。
    猜你喜欢
    • 2016-01-19
    • 2015-03-15
    • 2020-05-20
    • 1970-01-01
    • 2017-10-09
    • 2021-11-23
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多