使用JPQL左联接元素集合

时间:2019-02-19 05:16:11

标签: jpa jpql

假设我有此类,请注意,实体无论如何都不相关。

@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>不能作为选择

3 个答案:

答案 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用于在OneToManyFoo之间创建idsPointingToAnEntity。绝对不是要用作One-To-Many Relationship with Join Table