我可以在一个Spring Data JPA存储库方法中组合@Query定义和规范吗?

woy*_*ech 18 java spring hibernate jpa spring-data-jpa

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

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

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

Vla*_*cea 15

首先,您可能想先阅读此博客文章.其次,根据您的存储库应实现的JpaSpecificationExecutor接口,您可以使用规范运行以下查询:

  • count(规格规格)
  • 列出findAll(规格规格)
  • Page findAll(规格规格,可分页,可分页)
  • 列出findAll(规格规格,排序排序)
  • T findOne(规格规格)

所以你需要不能混合@Query(或查询方法)和规范.

你可以表达这个条件:

firstName <> ?1
Run Code Online (Sandbox Code Playgroud)

使用规范代替.然后,您可以根据需要组合任意数量的规格.

  • 这个主题很棒,我必须在JPA查询方法上进行多对多连接,然后传递一个Specification和Pageable项.肯定@Query不能与它混合(我测试过它).这对我的杯子没有任何答案.不知道如何设法让我的查询与关系表对应,并保持我的规范和Pageable项目:( (5认同)
  • 感谢您的答复!我知道我可以根据需要组合任意数量的规范,但是我有几个带有 *@Query* 注释的方法,现在需要使用 Specification,所以我必须将现有查询重写为 Specification 的对象。我想也许有一种方法可以将 *@Query* 和 Specification 结合起来。 (3认同)
  • @Alex 你找到解决你的问题了吗?因为我有类似的情况,所以我无法将查询和规范结合起来。如果您有任何解决方案,请帮助我们。 (2认同)
  • @AnshulKabra 那是很久以前的事了,但我记得最终使用 QueryBuilder 和 CriteriaAPI 来扩展我的 JpaRepository 并手动实现查询。接收可分页和规范,我创建整个查询和页面项。 (2认同)