jpa - JPQL left outer join 多对多关系

标签 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

请注意,某些标签未被任何项目引用,但我仍然希望它们包含在结果中(并且期望 SIZE(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;

它没有执行获得我想要的结果所需的 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

要提供更多详细信息...我有 3 个 SQL 表:item、tag 和 item_tag_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;
...

最佳答案

我不确定它是否是 EclipseLink 错误(不过对我来说似乎是一个错误),但您可以使用以下查询来解决问题(尽管未测试):

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

关于jpa - JPQL left outer join 多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20500715/

相关文章:

java - @Transactional 回滚问题

java - @JoinColumnS 涉及一对一关系中的 EAGER 获取

.net - 流畅的 NHibernate : mapping complex many-to-many (with additional columns) and setting fetch

mysql - Laravel 多对多关系或一对多关系

java - 如何在 JPA 中使用 Postgres JSONB 数据类型?

java - 使用 eclipselink.media-type 值 : application/json 设置 Marshaller 属性时出现 PropertyException

java - 当我的 pojos 分布在许多不同的包中时,将 jaxb.properties 放在哪里

mysql - JPQL性能分析

java - 为未知实体类型构建通用 LocalDate JPA 标准

ruby-on-rails - 在 Rails 上创建多对多记录