2017-11-13 4 views
1

Repository 클래스에서 사용한 HQL로 작성된 복잡한 쿼리 (다중 조인 및 서브 쿼리 사용)가 있습니다. 아래에있는 것과 유사합니다 -JPA 사용자 정의에 동적 조건 추가 Query

@Repository 
public interface DataRepository extends PagingAndSortingRepository<Data,String> { 

    public List<Data> findByService(@Param("service")Service service, Pageable page); 

    @Query("SELECT DISTINCT d from Data d " 
      +" WHERE (d.working in (SELECT d1 from Data d1 " 
       +" JOIN d1.working d1w " 
       +" JOIN d1.service s WITH (s in (:serviceList)))" 
      +" OR d.cleared IS NOT NULL) AND [..several other CRITERIA]") 
    public Page<Data> findForServices(@Param("serviceList")Set<Service> serviceList, Pageable page); 
.... 

이제 동적으로 기준을 추가해야합니다. 이 기준은 유연성이 뛰어나서 바로 내에서 HQL에 포함되지 않습니다. 그것은 어쨌든 가능합니까?

나는 인터넷을 통해 선별을하여 dynamic query에 대한 해결책을 발견했습니다. 그러나 나는 그들이 사용자 지정 쿼리가없는 경우, 즉 repository의 쿼리에 @Query이없는 경우에만 작동 할 것입니다.

다른 interesting question가 있습니다. 그러나 이는 쿼리 할 단일 테이블이있는 경우에도 적합합니다.

원시 SQL 쿼리로 전환하고 싶지 않습니다. 어떻게 해결할 수 있습니까?

+0

동적으로 생성하기 쉬운 'CriteriaQuery'로 변환 할 수 없습니까? 나는 다른 가능성에 대해 회의적입니다. 정확히 당신이 의미하는 바는 무엇입니까?하지만 쿼리 할 단일 테이블이있는 경우에도 적합합니다. 이 https://stackoverflow.com/a/30436524/6413377의 문제 일 수 있습니까? – pirho

답변

1

스펙 및 술어가있는 언급 된 Criteria API는 사용하기가 약간 어려우나 동적 조건을 처리하는 좋은 방법입니다. 어노테이션 기반 쿼리와 프로그래밍 방식 쿼리 작성을 혼용하는 것이 가능하지 않다고 생각합니다.