Jpa选择与关系

时间:2017-11-29 07:42:14

标签: java jpa jpql

我有4张关系表。 A,B,C,d。

所以我写了选择下面的文字:

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之间有多个关系,我想在一个A对象中选择所有(不同的A)。

您能帮我解决这个问题吗?也许这种做法很糟糕?

我使用EclipeLink数据提供程序。

1 个答案:

答案 0 :(得分:0)

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

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

不幸的是,EclipseLink没有过滤掉它们,您在结果中获得了同一实体的许多项目。虽然EclipseLink足够智能,但每个项目实际上都是相同的Java对象实例。

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

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