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

jei2mxaa  于 2023-03-19  发布在  Spring
关注(0)|答案(2)|浏览(223)

是否可以在一个仓库方法中同时使用@Query注解和规范?例如,我希望有这样一个方法:

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

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

0pizxfdo

0pizxfdo1#

第一件事,你应该读这个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来重写整个@Query

h7wcgrx3

h7wcgrx32#

我这样做是为了使用我的规范获得实体类型以外的响应,也许它可以帮助您在没有@Query的情况下解决您的需求:

public ImovelFilterResponseDTO getImovelsFilterByCriteria(Specification<Imovel> specification) {
    ImovelFilterResponseDTO imovelFilterResponseDTO = new ImovelFilterResponseDTO();
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<BigDecimal> query = builder.createQuery(BigDecimal.class);
    Root<Imovel> root = query.from(Imovel.class);
    Predicate predicate = specification.toPredicate(root, query, builder);
    if (predicate != null) {
        query.where(predicate);
    }
    BigDecimal areaHectaresMax =  entityManager.createQuery(query.select(builder.max(root.<BigDecimal>get("areaHectares")))).getSingleResult();
    imovelFilterResponseDTO.setFilterMaxArea(areaHectaresMax);
    return imovelFilterResponseDTO;
}

相关问题