【问题标题】:JPA Criteria Query for Left joins左连接的 JPA 条件查询
【发布时间】:2019-06-17 02:28:54
【问题描述】:

我是 JPA 的新手,我有一个 Left Join 场景。 我的本机 sql 查询如下,我使用左连接从 V_MONITORING 表中获取 st.id = 10001 的完整记录。 我有一些 id_legislature 的空值,也需要选择它们,因此使用左连接

select distinct 
    mv.id_set, mv.id_travel, mv.id_legislature
from 
   V_MONITORING mv 
     left join v_set st on mv.id_set = st.id
     left join v_travel fg on mv.id_travel = fg.id
     left join v_legislature gg on mv.id_legislature = gg.id;

与我使用 JPA 条件查询实现的相同,我无法获取空记录 下面是代码

Predicate predicate = cb.conjunction();
Root<MonitoringBE> mvRoot = criteriaQuery.from(MonitoringBE.class); 
mvRoot.fetch(MonitoringBE.id_set, JoinType.LEFT);
mvRoot.fetch(MonitoringBE.id_travel, JoinType.LEFT);
mvRoot.fetch(MonitoringBE.id_legislature, JoinType.LEFT);

final Path<Object> serieneinsatzterminPath= mvRoot.get(MonitoringBE.id_set);
predicate = cb.and(predicate, cb.EqualTo(serieneinsatzterminPath.get(SetBE.GUELTIG_VON_DATUM), startSetDate));

criteriaQuery.multiselect(
   mvRoot.get(MonitoringBE.id_travel).alias("id_travel"),
   mvRoot.get(MonitoringBE.id_set).alias("id_set"),
   mvRoot.get(MonitoringBE.id_legislature).alias("id_legislature"))
.distinct(true).where(predicate);

谁能指导我。

【问题讨论】:

标签: java jpa criteriaquery


【解决方案1】:

您必须用mvRoot.join(MonitoringBE.id_travel, JoinType.LEFT) 替换多选语句中的mvRoot.get(MonitoringBE.id_travel) 和其他人。否则,它们将最终进入内部连接。

【讨论】:

  • 非常感谢 Martin,它运行良好。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
相关资源
最近更新 更多