2011-08-25 3 views
2

많은 관계가 많은 두 개의 엔티티 인 Ablum과 Image가 있습니다. 모든 앨범 및 이미지 개수에 대한 계산을 얻는 기준 쿼리를 만들고 싶습니다. 나는 많은 앨범 요청이 있기 때문에 모든 앨범을 먼저 얻고 그 결과를 반복하여 카운트를 얻고 싶지 않습니다. 2 박 동안 일 했으니 까. 어쩌면 탈출구를 찾을 수 없다면 나는 SQL을 사용하기 위해 대체해야 할 것이다.복잡한 다 대다 JPA CriteriaQuery

답변

3

digitaljoel의 영감 덕분에 CriteriaBuilder에 콜렉션에 넣을 수있는 "size"라는 메서드 호출이 있다는 것을 알았습니다. 코드는 다음과 같습니다.

CriteriaBuilder cb = getCriteriaBuilder(); 
    CriteriaQuery<Object[]> query = cb.createQuery(Object[].class); 
    Root<AlbumEntity> albums = query.from(AlbumEntity.class); 
    query.select(cb.array(albums.get(AlbumEntity_.id), cb.size(albums.get(AlbumEntity_.images)))); 
    query.groupBy(albums.get(AlbumEntity_.id)); 

여기서 groupBy 호출은 필수입니다. 그렇지 않으면 오류가 발생합니다. 그러나이 방법은 엔티티 자체가 아닌 AlbumEntity의 ID를로드하는 것입니다. 아래의 코드를 사용하면 앨범 엔티티를로드 할 수 있습니다.

query.select(cb.array(albums, cb.size(albums.get(AlbumEntity_.images)))); 
    query.groupBy(albums.get(AlbumEntity_.id), ...); 

groupBy는 앨범 엔티티의 모든 속성을 포함해야합니다. 앨범 엔티티에 blob 유형 속성이 있으면 여전히 작동하지 않습니다.

2

JPA 매핑을 게시하지 않았으므로 몇 가지 가정을해야 할 것입니다. 따라서 많은 앨범에 대해 각각의 앨범에 List<YourImageClass> images이 있다고 가정합니다. 이것으로, 이것과 같은 것이 효과가 있습니다. 반환

select a, size(a.images) from Album a 

List.get(i)[0] 앨범 것 및 List.get(i)[1] 이미지 컬렉션의 대응 크기 것 List<Object[]>.

또는, 선택할 간단한 bean을 정의 할 수 있습니다.

public class AlbumResult { 
    private Album album; 
    private Integer imageCount; 
    public AlbumResult(Album a, Integer size) { 
     album = a; 
     imageCount = size; 
    } 
    // getters and setters here 
} 

같은 뭔가 그럼 당신은

select new AlbumResult(a, size(a.images)) from Album a; 

내가 기준 쿼리를 처리 결코 할 수 있지만 JPQL은 criteria 질의로 번역 하찮은해야한다 간단하다.

+0

digitaljoel에게 감사 드려요.하지만 프로젝트에서 JPQL을 사용할 수 없습니다. 그러나 당신의 아이디어는 저에게 영감을주었습니다. 고마워요 :) – hzywind

+0

그래, 당신은 귀하의 질문에 기준 쿼리가 필요하다고 언급했는데, 내 대답은 JPQL이 조건 쿼리로 변환하기에 충분히 간단해야한다고 말했지 만, 나는 기준을 사용하지 않았기 때문에 쿼리 당신이 내가 원하는 것보다 훨씬 빨리 완료 될 것이라고 생각했습니다. 다음은 크기 함수를 얻은 곳입니다. http://www.objectdb.com/java/jpa/query/jpql/collection#Criteria_Query_Collection_Expressions_ – digitaljoel