Hibernate 如何在JPA JPQL查询中连接一个实体的两个集合?

Hibernate 如何在JPA JPQL查询中连接一个实体的两个集合?,hibernate,jpa,persistence,jpql,Hibernate,Jpa,Persistence,Jpql,我遇到过这样一种情况,我有一个实体,它有两个集合 @Entity Company @OneToMany Collection<Cars> @OneToMany Collection<Scooter> worksfine返回公司 select e from com.net.company e JOIN e.cars cr JOIN e.scooter where cr.carname IN ('BMW'); 不返回任何内容 我确实理解我的jpql是错误的,我认为问题

我遇到过这样一种情况,我有一个实体,它有两个集合

@Entity
Company

@OneToMany
Collection<Cars>

@OneToMany
Collection<Scooter>
worksfine返回公司

select e from com.net.company e JOIN e.cars cr JOIN e.scooter where cr.carname IN ('BMW');
不返回任何内容


我确实理解我的jpql是错误的,我认为问题在于我加入它的方式。在这方面可以帮我一些忙吗

不要添加任何不需要的联接。他们只是减慢了你的查询速度。 在查询中不使用连接的
cars
scooter
。join子句的唯一作用是,您的查询只返回与至少1辆
car
和1辆
scooter
关联的
公司。但这似乎不是我们想要的行为

如果要使与
踏板车
汽车
实体的联接成为可选,则需要使用
左联接
(但再次说明:如果不使用实体,为什么要联接实体):

如果您要加入实体以初始化
公司
实体的关联映射属性,则需要使用
加入获取
子句或
左加入获取
子句:

select e from com.net.company e LEFT JOIN FETCH e.cars cr LEFT JOIN FETCH e.scooter where cr.carname IN ('BMW');

我在这里更详细地解释了
JOIN FETCH
子句和初始化关联的其他选项:

当指示器从此不再使用时,“JOIN e.scooter”试图实现什么?为什么不查看JPA提供者日志并查看为每个查询调用的SQL?这被称为“调试”@DN1我想与公司实体加入scooters我可能有也可能没有scooter的名称列表其选项此加入的唯一效果正是您不想要的:只返回至少有一个scooter的公司。这是意料之中的,也是正常的:这就是内部联接的用途。所以,如果你想接受没有scooter的公司,只需离开这个额外的连接,它没有任何其他影响。我不明白你还想通过加入来实现什么。
select e from com.net.company e LEFT JOIN e.cars cr LEFT JOIN e.scooter where cr.carname IN ('BMW');
select e from com.net.company e LEFT JOIN FETCH e.cars cr LEFT JOIN FETCH e.scooter where cr.carname IN ('BMW');