左联接的JPA标准查询

时间:2019-01-23 13:22:15

标签: java jpa criteriaquery

我是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);

有人可以指导我吗?

1 个答案:

答案 0 :(得分:0)

您必须用mvRoot.get(MonitoringBE.id_travel)替换多选语句中的mvRoot.join(MonitoringBE.id_travel, JoinType.LEFT)和其他内容。否则,它们将以内部联接结尾。