使用条件构建器忽略JPA Hibernate Generated Left Join

时间:2014-03-20 04:45:01

标签: java sql hibernate jpa

我有一个实体(Person)与另一个实体(可用性)和其他实体有 @ManyToOne 关系。当我获得人员时,我没有可用性为空的人,因为Hibernate执行内部联接(如果我有一个急切的提取),或者选择是否是懒惰的提取。 同时,我尝试从结果创建另一个bean,所以我使用:

query.select(builder.construct(MyPerson.class,root.get("availability").get("date").....)
This will generate 
   select a.date, ... from Person p, Availability a Where p.availId = a.id.
As I need a Left join, I have added to my code :
   Join<Availability, person> avail = root.join("availability", JoinType.LEFT);

奇怪的是,它会生成一个LEFT OUTER join,但仍会使用旧请求

 select **a2**.date, ... 
   from Person p, 
   LEFT OUTER JOIN Availability a1 on a1.id = p.availId
   ,**Availability a2** 
   **Where p.availId = a2.id.** 

它出了什么问题? 只生成左连接的唯一情况是我用root构造新bean。 (使用延迟加载),但会产生太多其他查询。

 query.select(builder.construct(MyPerson.class,root)

1 个答案:

答案 0 :(得分:1)

最后,我找到解决方案。实际上,我不需要使用     加入avail = root.join(“availability”,JoinType.LEFT);

所以我删除了它,在创建新bean的时候我做了:     query.select(builder.construct(MyPerson.class,     root.join(“availability”,JoinType.LEFT).get(“date”))

现在我只有一个生成的查询,其中 LEFT OUTER JOIN