Jpa JPQL在多对多关系上左外联接

Jpa JPQL在多对多关系上左外联接,jpa,many-to-many,eclipselink,left-join,jpql,Jpa,Many To Many,Eclipselink,Left Join,Jpql,我正在尝试编写一个查询(使用JPQL)来获取所有标记以及每个标记被所有项引用的频率。JPQL是: SELECT t.id, t.name, SIZE(t.items) FROM Tag t GROUP BY t.id, t.name ORDER BY t.name ASC 请注意,有些标记没有被任何项引用,但我仍然希望它们包含在结果中(预期大小(t.items)为零) 但是,当执行此查询时,它只返回具有与之关联的项的标记,而忽略未被任何项引用的标记。从JPA生成的SQL是: SELECT t0

我正在尝试编写一个查询(使用JPQL)来获取所有标记以及每个标记被所有项引用的频率。JPQL是:

SELECT t.id, t.name, SIZE(t.items) FROM Tag t GROUP BY t.id, t.name ORDER BY t.name ASC
请注意,有些标记没有被任何项引用,但我仍然希望它们包含在结果中(预期大小(t.items)为零)

但是,当执行此查询时,它只返回具有与之关联的项的标记,而忽略未被任何项引用的标记。从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;
它不是执行左外连接,这是获得我想要的结果所必需的。如果我是用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的一个限制(或者一个bug)?我正在使用PostgreSQL v9.2和EclipseLink v2.4.2

要提供更多详细信息。。。我有3个SQL表:item、tag和item\u tag\u map。下面是相关Java类的片段:

@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;
...
@实体
@表(name=“item”)
公共类项实现可序列化{
@身份证
@列(name=“id”,updateable=false)
私有字符串id;
@多个(级联=级联类型.ALL)
@可接合(
name=“项目标签地图”,
joinColumns={@JoinColumn(name=“item_id”,referencedColumnName=“id”,nullable=false)},
inverseJoinColumns={@JoinColumn(name=“tag\u id”,referencedColumnName=“id”,nullable=false)})
私有列表标签;
...
@实体
@表(name=“tag”)
@命名查询({
@NamedQuery(name=“Tag.findAllStats”,query=“按t.id从标记t组中选择t.id、t.name、大小(t.items),按t.name ASC从标记t组中选择t.name订单”),
})
公共类标记实现可序列化{
@身份证
@列(name=“id”,updateable=false)
私人长id;
私有字符串名称;
@ManyToMany(mappedBy=“tags”,fetch=FetchType.LAZY)
私人清单项目;
...

我不确定这是否是EclipseLink bug(虽然对我来说似乎是一个bug),但您可能可以使用以下查询来解决问题(尽管未经测试):


谢谢!我试过了,效果很好。从JPQL生成的SQL不是最好的,但现在已经足够了。
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