많은 관계가 많은 두 개의 엔티티 인 Ablum과 Image가 있습니다. 모든 앨범 및 이미지 개수에 대한 계산을 얻는 기준 쿼리를 만들고 싶습니다. 나는 많은 앨범 요청이 있기 때문에 모든 앨범을 먼저 얻고 그 결과를 반복하여 카운트를 얻고 싶지 않습니다. 2 박 동안 일 했으니 까. 어쩌면 탈출구를 찾을 수 없다면 나는 SQL을 사용하기 위해 대체해야 할 것이다.복잡한 다 대다 JPA CriteriaQuery
2
A
답변
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 질의로 번역 하찮은해야한다 간단하다.
관련 문제
- 1. 양방향 다 대다 JPA
- 2. JPA 2 CriteriaQuery Question
- 3. JPA 2의 FetchMode 2 CriteriaQuery
- 4. JPA : Google App의 다 대다 관계
- 5. nHibernate - 복잡한 다 대다 클래스 매핑
- 6. playframework의 다 대다 삭제 문제
- 7. 변화 "다 대다" "일대 다"
- 8. JPA 최대 절전 모드 다 대다 케스 케이 딩
- 9. JPA - 자체와 복합 키가있는 테이블의 다 대다 관계
- 10. JPA 동일한 엔티티의 객체 간 다 대다 관계에 대한 어노테이션
- 11. 교리 설정 방법 다 대다 다 대다 관계
- 12. 매핑 NHibernate 다 대다
- 13. oop의 다 대다 관계
- 14. 레일의 다 대다 관계
- 15. 다 대다 MySQl PHP
- 16. sqlalchemy의 다 대다 교차
- 17. ORM과 다 대다 관계
- 18. django 다 대다 비교
- 19. 일반 다 대다 관계
- 20. NHibernate 다 대다 매핑
- 21. 다 대다 관계로 저장
- 22. 다 대다 관계가있는 CompileAssemblyFromDom
- 23. 다 대다 관계
- 24. ActiveRecord와 다 대다 관계?
- 25. 아음속 다 대다
- 26. 아음속 다 대다 관계
- 27. 다 대다 엔티티 처리
- 28. NHibernate 다 대다 기준
- 29. Datamapper 다 대다 관계
- 30. 문서 데이터베이스 - 다 대다
digitaljoel에게 감사 드려요.하지만 프로젝트에서 JPQL을 사용할 수 없습니다. 그러나 당신의 아이디어는 저에게 영감을주었습니다. 고마워요 :) – hzywind
그래, 당신은 귀하의 질문에 기준 쿼리가 필요하다고 언급했는데, 내 대답은 JPQL이 조건 쿼리로 변환하기에 충분히 간단해야한다고 말했지 만, 나는 기준을 사용하지 않았기 때문에 쿼리 당신이 내가 원하는 것보다 훨씬 빨리 완료 될 것이라고 생각했습니다. 다음은 크기 함수를 얻은 곳입니다. http://www.objectdb.com/java/jpa/query/jpql/collection#Criteria_Query_Collection_Expressions_ – digitaljoel