在 JPQL 中使用自定义构造函数返回相关实体时如何避免 INNER JOIN
How to avoid INNER JOIN when returning a related entity using a custom constructor in 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:
我在这里使用自定义构造函数,因为我不想查询 returning 用户密码(和其他属性)。
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,我的查询将 return 空列表或抛出 NoResultException。
我希望查询 return 用户,无论他是否有部门。
有办法避免这种情况吗?
如何告诉 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
我有这样的东西:
@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:
我在这里使用自定义构造函数,因为我不想查询 returning 用户密码(和其他属性)。
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,我的查询将 return 空列表或抛出 NoResultException。 我希望查询 return 用户,无论他是否有部门。
有办法避免这种情况吗? 如何告诉 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