2013-12-10 2 views
1

모든 태그를 얻기 위해 쿼리를 작성하려고합니다 (JPQL 사용). 모든 태그가 얼마나 자주 모든 항목에서 참조되었는지 확인하려고합니다. 일부 태그가 모든 항목에서 참조되지 않습니다JPQL은 다 대다 관계에 외부 조인을 남겼습니다.

SELECT t.id, t.name, SIZE(t.items) FROM Tag t GROUP BY t.id, t.name ORDER BY t.name ASC 

주,하지만, 난 여전히 (그리고 SIZE (t.items 기대) 제로 것)들이 결과에 포함 할 다음 JPQL입니다.

그러나이 쿼리를 실행하면 관련 항목이있는 태그 만 반환되며 항목에 의해 참조되지 않는 태그는 무시됩니다. JPA에서 생성 된 SQL은 다음과 같습니다.

SELECT t0.id as a1, t0.NAME AS a2, COUNT(t1.id) FROM tag t0, item_tag_map t2, item t1 WHERE ((t2.tag_id = t0.id) AND (t1.id = t2.item_id)) GROUP BY t0.id, t0.NAME ORDER BY t0.NAME ASC; 

원하는 결과를 얻으려면 LEFT OUTER JOIN을 수행하지 않습니다. SQL에서이 글을 쓰고 싶다면

select t.id, t.name, count(map.item_id) from tag as t left join item_tag_map as map on map.tag_id = t.id group by t.id, t.name order by t.name ASC; 

JPQL에서이를 수행 할 수있는 방법이 있습니까? 내가 잘못했거나 JPQL (또는 버그)의 한계입니까? PostgreSQL v9.2 및 EclipseLink v2.4.2를 사용하고 있습니다.

자세한 내용을 제공하려면 ... item, tag 및 item_tag_map이라는 3 개의 SQL 테이블이 있습니다. 그리고 여기에 관련된 자바 클래스의 코드 조각입니다 : 그것이는 EclipseLink의 버그인지 아닌지 잘 모르겠어요

@Entity 
@Table(name="item") 
public class Item implements Serializable { 
    @Id 
    @Column(name="id", updatable=false) 
    private String id; 

    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(
     name = "item_tag_map", 
     joinColumns = { @JoinColumn(name = "item_id", referencedColumnName = "id", nullable=false) }, 
     inverseJoinColumns = { @JoinColumn(name = "tag_id", referencedColumnName = "id", nullable=false) }) 
    private List<Tag> tags; 
... 


@Entity 
@Table(name="tag") 
@NamedQueries({ 
    @NamedQuery(name="Tag.findAllStats", query="SELECT t.id, t.name, SIZE(t.items) FROM Tag t GROUP BY t.id, t.name ORDER BY t.name ASC"), 
}) 
public class Tag implements Serializable { 
    @Id 
    @Column(name="id", updatable=false) 
    private long id; 

    private String name; 

    @ManyToMany(mappedBy="tags", fetch=FetchType.LAZY) 
    private List<Item> items; 
... 

답변

4

(그것이 비록, 나에게 하나 인 것 같습니다),하지만 당신은 아마 다음을 사용할 수 있습니다 질문 (문제는 해결되지 않음) :

select t.id, t.name, count(i.id) from Tag t 
left join t.items i 
group by t.id, t.name 
order by t.name asc 
+0

감사합니다! 나는 이것을 시험해 보았다. JPQL에서 생성 된 SQL은 가장 크지 않지만 지금은 충분합니다. –

관련 문제