2013-01-07 2 views
1

다른 필터를 사용하여 실제로 연구하고 있습니다.JpaSpecificationExecutor : 사양이있는 복잡한 쿼리

간단한 쿼리를 만들기 위해 JpaRepository를 사용하고 있으므로 JpaSpecificationExecutor가 Criterias를 사용하여 동적 쿼리를 만들 수 있습니다.

내 문제는 그룹 및 count()로 복잡한 쿼리를 만들어야한다는 것입니다. 그룹별로 잘되었지만 "선택"부분을 "카운트"명령을 초과 할 수있는 방법을 찾지 못했습니다.

아무도 나를 도울 수 있습니까?

return new Specification<Article>() { 

    @Override 
    public Predicate toPredicate(final Root<Article> root, 
     final CriteriaQuery<?> query, final CriteriaBuilder builder) { 
     //count ??? 
     query.groupBy(root.get(Article_.id)); 
     Predicate p = builder.and(builder.like(root.<String> get(Article_.title), "%" + title + "%")); 

     return p; 
    } 
} 

감사 :

내가 여기에 스프링 3.1.2 스프링 JPA 데이터 1.0.3 를 사용하고있어 내 코드입니다!

답변

3

불행하게도 당신이 스프링 데이터 사양으로이 작업을 수행 할 수있는 솔루션을 제공 할 수 있습니다. spring-data specifications - return list of ids instead of objects

은 당신이 할 수있는 필드 목록을 얻으려면 :

당신은 이유 여전히 여기에 스프링 데이터를 사용하는 동안 그것을 수행하는 방법 을 볼 수 있습니다 (단 하나의 필드를 반환하는 간단한 쿼리있다) JPA Tuple을 사용하십시오. JPA & Criteria API - Select only specific columns

짧은 버전 : 당신은 여기에서 예를 찾을 수 있습니다 당신은 CriteriaQuery<Tuple>를 사용하는 사용자 정의 스프링 데이터 저장소를 만들어야합니다.

+1

도움을 주셔서 감사합니다. 나는 두 번의 요청을하기로했다. 하나는 모든 이드를 사양으로 가져 오는 것입니다. 내 ID와 일치하는 간단한 쿼리로 두 번째 (계산). – user1838850

1

스프링 데이터의 org.springframework.data.jpa.repository.support.SimpleJpaRepository을 보면 getCountQuery(..)이라는 메서드가 있습니다. 이 쿼리는 다음과 같습니다.

/** 
* Creates a new count query for the given {@link Specification}. 
* 
* @param spec can be {@literal null}. 
* @return 
*/ 
private TypedQuery<Long> getCountQuery(Specification<T> spec) { 

    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Long> query = builder.createQuery(Long.class); 

    Root<T> root = applySpecificationToCriteria(spec, query); 
    query.select(builder.count(root)); 

    return em.createQuery(query); 
} 

스프링 데이터 JPA의 Pageable의 구성 요소에 사용되며,

+1

안녕하세요, 귀하의 답변 주셔서 감사합니다. 그러나이 방법은 간단한 계산으로 만 가능합니다. 어떻게하면 "a.value, a (a.id)를 a.vue별로 A 그룹에서 선택 하시겠습니까?"와 같은 쿼리를 만들 수 있습니까? – user1838850

+0

스프링 데이터 JPA는 rchukh가 언급했듯이 완벽한 사용자 정의 쿼리를 수행 할 수 있습니다. 이미 SQL 문이 있다면 엔티티 관리자가이를 NativeQuery로 실행 한 다음 결과를 직접 객체에 매핑 할 수 있습니다. –