2013-06-14 10 views
3

엔티티에서 데이터를 가져 오기 위해 프로젝션을 사용하려고합니다. 하나. 투영에 대한 생성자는 세 가지 인수를 취합니다. 집합, 정수 및 다른 정수. 인수로 설정을하지 않으면이 모든 것이 잘 작동하지만 집합을 추가하자마자 SQL 구문 쿼리 오류가 발생하기 시작합니다. 여기 QueryDSL 프로젝션의 컬렉션

이가 난 무엇의 단순화 된 버전이기 때문에 여기에
@Entity 
public class Resource { 
    private Long id; 
    private String name; 
    private String path; 
    @ManyToOne 
    @JoinColumn(name = "FK_RENDITION_ID") 
    private Rendition rendition; 
} 

@Entity 
public class Document { 
    private Long id; 
    private Integer pageCount; 
    private String code; 
} 

@Entity 
public class Rendition { 
    Long id; 
    @ManyToOne 
    @JoinColumn(name="FK_DOCUMENT_ID") 
    Document doc; 
    @OneToMany(mappedBy="rendition") 
    Set<Resource> resources; 
} 

public class Projection {   
    @QueryProjection 
    public Projection(Set<Resource> resources, Integer pageCount, String code) { 
    } 
} 

내가 사용하고 무엇을 같은 쿼리 (정확히 동일하지 않습니다 ... 내가 함께 일하고 있어요 무엇의 예입니다 ...)

이 프로젝션 클래스에는 rendition.resources가없는 한 정상적으로 작동합니다. 나는 시도하고 그에 추가하면, 내가이 시작 있도록 출력의 SQL을 변경 (잘못된 SQL 오류를 받기 시작.

select . as col_0_0_ 

을 그래서, 여기 내 주요 질문은 내가 설정 등을 포함 어떻게 것 같다 투사의 목적은? 가능, 아니면 그냥 잘못 여기서 뭔가를하고있는 중이 야? 예측에 컬렉션을 사용

답변

4

는 JPA에서 신뢰할 수없는 것입니다. 컬렉션에 가입하고 대신 결과를 집계하는 것이 안전하다.

Querydsl 결과 집계에 사용할 수도 있습니다. http://www.querydsl.com/static/querydsl/3.2.0/reference/html/ch03s02.html#d0e1799

다음과 같이 입력하십시오.

QRendition rendition = QRendition.rendition; 
Projection projection = from(rendition) 
    .innerJoin(rendition.document, document) 
    .innerJoin(rendition.resources, resource) 
    .where(document.id.eq(documentId)) 
    .limit(1) 
    .transform(
     groupBy(document.id).as(
      new QProjection(set(resources), 
       document.pageCount, 
       document.code)));