假设我有此类,请注意,实体无论如何都不相关。
@Entity
class Laptop {
@Id
String userId;
@Column
String name;
...
}
@Entity
class Foo {
...
@Column
@ElementCollection
List<String> idsPointingToAnEntity;
...
}
鉴于我有一个Foo
属性的idsPointingToAnEntity
类,因此可以在其中存储笔记本电脑ID或任何String ID的列表。假设Foo
的idsPointingToAnEntity = [1,2,3],这个[1,2,3]在数据库中有一个等效的Laptop条目。
鉴于结果是按照笔记本电脑名称排序的Foo列表,我如何才能按JPQL的顺序离开/加入它们。
从理论上讲,我认为是这样的。
Select f From Foo f LEFT JOIN Laptop l ON l.id IN f.idsPoitingToAnEntity ORDER by l.name
但这对我来说是个错误,因为f.idsPoitingToAnEntity
是一个Join表。
注意:idsPointingToAnEntity
也可以是另一个实体,使得List<Laptop>
不能作为选择
答案 0 :(得分:0)
您不能使用Joins来获得以下结果:
SELECT l FROM Laptop l, Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name
或者使用CROSS JOIN
,这是一种不需要任何匹配条件的特殊联接:
SELECT l FROM Laptop l
CROSS JOIN Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name
PS:在这种情况下使用交叉联接的问题在于,它会生成笛卡尔积,而不是左侧的所有行。
答案 1 :(得分:0)
如果您使用的是JPA 2.1或更高版本,请在JPQL中对不相关的实体使用JOIN ON
。首先加入ID表,如下所示:
select f from Foo f
join f.idsPointingToAnEntity id
join Laptop l ON id=l.id
join AnotherEntity a ON id=a.id
答案 2 :(得分:0)
简短的回答是根本不这样做。它滥用了特定功能,并可能随着列表的增加而引起麻烦。您没有这样做的充分理由。如果您认为列表很小,那么数据库负载就很小,并且没有理由将引用放入ElementCollection
中。如果列表变大,您绝对不希望使用ElementCollection
。
参考Difference between @OneToMany and @ElementCollection?。 ElementCollection
用于在OneToMany
和Foo
之间创建idsPointingToAnEntity
。绝对不是要用作One-To-Many Relationship with Join Table。