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 不同的,但会过滤重复的实体。或者,您可以手动过滤它们。
我有 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 不同的,但会过滤重复的实体。或者,您可以手动过滤它们。