我有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数据提供程序。
答案 0 :(得分:0)
这是加载OneToMany
关系的典型问题。
这是因为SQL结果集的本质。想象一下实体与其链接的其他实体的连接的SQL结果。在左侧,该实体的字段将复制为其所拥有的相关实体的数量。
不幸的是,EclipseLink没有过滤掉它们,您在结果中获得了同一实体的许多项目。虽然EclipseLink足够智能,但每个项目实际上都是相同的Java对象实例。
这也是您无法在此类查询中使用setMaxResults
的原因。
您需要使用distinct
关键字,此特定键中的关键字不会映射到真正的SQL不同,但会过滤重复的实体。或者,您可以手动过滤它们。