Jpa select 有关系

Jpa select with relations

我有 4 个关系表。 A,B,C,D.

所以我在下面写了select:

select NEW org.example.ExtendsA(a,b.name,c.name,d.name)
from A a LEFT JOIN a.bItems b LEFT JOIN a.cItems c LEFT JOIN b.dItems d 
order by b.name ASC;

A唯一但关系不完整

我试过这个:

select NEW org.example.ExtendsA(a,b.name,c.name,d.name)
from A a LEFT JOIN FETCH a.bItems b LEFT JOIN FETCH  a.cItems c
LEFT JOIN FETCH b.dItems d order by b.name ASC;

A 不是唯一的。

对象定义为:

@Entity
public class A implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "NAME")
    private String name;

    @OneToMany(mappedBy = "aId")
    private List<B> bItems;

    @OneToMany(mappedBy = "aId")
    private List<C> cItems;

}

有些关系是空的,但需要一个具有空关系的对象。 一些 A 对象在 B 和 C 之间有不止一种关系,我想 select 与一个 A 对象(不同的 A)。

你能帮我解决这个问题吗?可能方法不好?

我使用 EclipeLink 数据提供程序。

这是加载 OneToMany 关系的典型问题。

这是因为 SQL 结果集的性质。想象一下 SQL 实体与链接到它的其他实体的连接结果。在左侧,该实体的字段将被复制的次数与它拥有的相关实体的数量一样多。

不幸的是,EclipseLink 不会过滤掉它们,您会在结果中得到许多相同实体的项目。虽然,EclipseLink 足够聪明,每个项目实际上都是相同的 Java 对象实例。

这也是您不能在此类查询中使用 setMaxResults 的原因。

您需要使用 distinct 关键字,在这个特定的键中不会映射到真正的 SQL 不同的,但会过滤重复的实体。或者,您可以手动过滤它们。