Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 使用JPQL左键连接元素集合_Jpa_Jpql - Fatal编程技术网

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将不起作用,因为它没有绑定到名称,它可以是任何实体的属性