如何使用 JPA 标准 api 左连接两个不相关的实体?
how to left join two unrelated entities with JPA criteria api?
使用 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
如何使用条件 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")))
但这不允许我指定它是左连接。
您对 Criteria 查询所做的操作不允许您将其指定为左联接,因为它实际上不是左联接。您的查询中只有多个根,并且根据使用笛卡尔乘积的 Hibernate documentation,但是如果没有匹配项,使用左连接您会在右侧得到空值。
由于 Form interface 只允许您从实体的属性创建连接,我认为您想要实现的目标无法通过条件 API 实现。您要么必须对数据库执行两次查询,要么必须使用 JPQL 或 SQL 在一次查询中完成。
使用 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
如何使用条件 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")))
但这不允许我指定它是左连接。
您对 Criteria 查询所做的操作不允许您将其指定为左联接,因为它实际上不是左联接。您的查询中只有多个根,并且根据使用笛卡尔乘积的 Hibernate documentation,但是如果没有匹配项,使用左连接您会在右侧得到空值。
由于 Form interface 只允许您从实体的属性创建连接,我认为您想要实现的目标无法通过条件 API 实现。您要么必须对数据库执行两次查询,要么必须使用 JPQL 或 SQL 在一次查询中完成。