bestsource

Spring Data JPA 저장소 메서드에서 @Query 정의를 사양과 결합할 수 있습니까?

bestsource 2023. 7. 28. 22:29
반응형

Spring Data JPA 저장소 메서드에서 @Query 정의를 사양과 결합할 수 있습니까?

둘 다 사용할 수 있습니까?@Query주석 및 사양을 하나의 저장소 방법으로 지정할 수 있습니까?예를 들어, 다음과 같은 방법이 있습니다.

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

가능한가요? 아니면 전체 질의를 작성해야 하나요?Predicate그리고 그것을 제거합니다.@Query주석?

우선, 당신은 이 봄 블로그 게시물을 읽어야 합니다.

둘째, 저장소가 구현해야 하는 인터페이스에 따라 다음 방법이 수행됩니다.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)

그래서, 당신은 섞을 수 없습니다.@Querya를 사용한 정의Specification.

하지만, 당신이 표현할 수 있기 때문에.firstName <> ?1를 사용한 조건Specification그리고 원하는 만큼의 사양을 결합하기 때문에 전체를 다시 작성할 수 있습니다.@Query사용.Specification뿐인

제가 가지고 있는 사양을 사용하여 엔티티 유형이 아닌 다른 응답을 얻기 위해 이 해결 방법을 사용했습니다. @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;
}

언급URL : https://stackoverflow.com/questions/26379522/can-i-combine-a-query-definition-with-a-specification-in-a-spring-data-jpa-repo

반응형