Jpa 使用JPQL左键连接元素集合
假设我有这个类,请注意实体在任何情况下都不相关Jpa 使用JPQL左键连接元素集合,jpa,jpql,Jpa,Jpql,假设我有这个类,请注意实体在任何情况下都不相关 @Entity class Laptop { @Id String userId; @Column String name; ... } @Entity class Foo { ... @Column @ElementCollection List<String> idsPointingToAnEntity; ... } @实体 班级笔记本电脑{ @身份证 字符串用户标识; @纵队 字符串名; ... } @
@Entity
class Laptop {
@Id
String userId;
@Column
String name;
...
}
@Entity
class Foo {
...
@Column
@ElementCollection
List<String> idsPointingToAnEntity;
...
}
@实体
班级笔记本电脑{
@身份证
字符串用户标识;
@纵队
字符串名;
...
}
@实体
福班{
...
@纵队
@元素集合
列出IDSPointingToAncity;
...
}
假设我有一个Foo
类,该类的属性为idspointingtoanity
,我可以在那里存储笔记本电脑ID列表或任何字符串ID。假设Foo
有idsPointingToAntity=[1,2,3],这个[1,2,3]在数据库中有一个等价的笔记本条目
如果结果是一个按笔记本电脑名称排序的Foo列表,那么我如何在JPQL中留下join/join命令
理论上我认为是这样的
从Foo中选择f f左键按l.name按f.ids的幂次顺序在l.id上加入l
但这对我来说是一个错误,因为f.idspoitingtoanity
是一个联接表
注意:
idspointingtoanity
也可以是另一个实体,使列表
不是一个选项您可以使用无联接来获得此结果:
SELECT l FROM Laptop l, Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name
或使用一种特殊类型的联接,不需要任何匹配条件:
SELECT l FROM Laptop l
CROSS JOIN Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name
PS:在这个场景中使用交叉连接的问题是,它生成笛卡尔积,而不是从左侧开始的所有行。如果您使用JPA 2.1或更高版本,则在JPQL中对不相关的实体使用
连接。首先加入IDs表,如下所示:
select f from Foo f
join f.idsPointingToAnEntity id
join Laptop l ON id=l.id
join AnotherEntity a ON id=a.id
简单的回答就是不要这样做。它误用了特定功能,并且随着列表的增长可能会导致麻烦。你这样做没有充分的理由。如果您认为列表很小,那么数据库负载就很小,没有理由将引用放入ElementCollection
。如果列表变大,您肯定不需要ElementCollection
参考资料。ElementCollection
用于在您的情况下,Foo
和idsPointingToAnantity
之间创建一个OneToMany
。它绝对不是要用作。您不能在idsPointingToAntity
上使用@OrderColumn
吗?目标表包含一列名称
,因此@OrderColumn(name=“name”)
应与@ElementCollection
一起使用。。。例如,选中标题“添加OrderColumn”@OrderColumn将不起作用,因为它没有绑定到名称,它可以是任何实体的属性