如何使用JPA标准api左连接两个不相关的实体?

kfc*_*kfc 6 criteria-api jpa-2.1 hibernate-5.x jakarta-ee

使用 JPA 2.1 和 hibernate 5.1.x,这可以使用 JPQL

select s.lowerBound,
l.status
...
from Serie s
left join Line l on
s.lowerBound between l.lineStart and l.lineEnd
Run Code Online (Sandbox Code Playgroud)

我如何使用 Criteria api 编写这个?我试过这个

Root<Serie> serieRoot = query.from(Serie.class);
Root<Line> lineRoot query.from(Line.class);
query.where(criteriaBuilder.between(s.get("lowerBound"), l.get("lineStart"), s.get("lineEnd")))
Run Code Online (Sandbox Code Playgroud)

但这不允许我指定它是左连接。

ytg*_*ytg 5

您对 Criteria 查询所做的操作不允许您将其指定为左联接,因为它并不是真正的左联接。您的查询中只有多个根,并且根据使用笛卡尔积的Hibernate 文档,但是使用左连接,如果没有匹配项,您会在右侧得到空值。

由于Form 接口只允许您从实体的属性创建联接,因此我认为使用 Criteria API 无法实现您想要实现的目标。您要么必须对数据库执行两次查询,要么必须使用 JPQL 或 SQL 在一次查询中执行此操作。

  • 遗憾的是它不能用标准 API 来完成。每种方法,无论是 JPQL 还是标准 API,都缺少另一种方法所具有的一些功能。真令人沮丧 (7认同)