如何在JPQL中使用自定义构造函数返回相关实体时避免INNER JOIN

时间:2015-03-12 14:53:41

标签: java hibernate jpa jpql

我有这样的事情:

@Entity
public class User implements Serializable {
  ...
  public User(String login, Division division) {
      this.login = login;
      this.division = division;
  }

  @ManyToOne
  public Division getDivision() {
      return division;
  }
  ...

JQPL:

我在这里使用自定义构造函数,因为我不希望查询返回用户的密码(以及其他属性)。

SELECT new com.xyz.app.beans.User(u.login, u.division)
FROM User u
WHERE u.login = :login

SQL生成:

select
    user0_.login as col_0_0_,
    user0_.division_id as col_1_0_
from
    dbo.User user0_ 
inner join
    dbo.Division division1_ 
        on user0_.division_id=division1_.id 
where
    user0_.login=?

显然,如果Division为null,我的查询将返回一个空列表或抛出NoResultException。 我希望查询返回用户,无论他是否有分组。

有办法避免这种情况吗? 如何告诉Hibernate执行LEFT JOIN而不是INNER JOIN?

1 个答案:

答案 0 :(得分:1)

由于您在u.division子句中使用select,因此它会隐式转换为内连接。要包括没有该部门的用户,请使用此

SELECT new com.xyz.app.beans.User(u.login, d)
FROM User u left join u.division d
WHERE u.login = :login