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

标签 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?

最佳答案

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

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

关于java - 在 JPQL 中使用自定义构造函数返回相关实体时如何避免 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29013041/

相关文章:

java - GSON将json对象转换为JAVA对象

hibernate - 带有列表的 Restrictions.eq

java - 集群故障转移后连接到 Aurora-Mysql 时出现通信链路故障

java - 定义列表的顺序

mysql - 定期删除数据库中超过一个月的所有条目的最有效方法

java - 在我的测试类中使用 PageFactory POM 中的 WebElements

java - 如何从struts bean中获取值?

java - hibernate 在选择期间锁定表多长时间?

java - java.util.Calendar.MONTH 和 Oracle 数据库 MONTH 函数之间的差异

java - 对于移动平台浏览器来说,Java Applet 的替代品有哪些?混淆的 Javascript 安全吗?