我创建了两个具有单向映射的实体
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id", unique = true, nullable = false)
private String userId;
@Column("email")
private String email;
@OneToOne
@JoinColumn(name = "user_id",insertable=false, updatable=false)
private UserAccountStatus accountStatus;
}
public class UserAccountStatus {
@Id
private String userId;
private String status;
}
我正在询问以下两个问题
@EntityGraph(attributePaths = {"accountStatus"})
Optional<UserEntity> findByEmail(String email); ---> query 1
@EntityGraph(attributePaths = {"accountStatus"})
@Query("SELECT u FROM UserEntity u WHERE u.kycVerified = true and u.accountStatus.status = 'ACTIVE'") ---> query2
Slice<UserEntity> findAllVerifiedAndActiveUsers(Pageable pageable);
对于查询 2 hibernate 仅使用 JOIN
创建了下面的查询select
*
from
user_entity ue1_0
join
cs_customer_status as1_0
on as1_0.user_id=ue1_0.user_id
where
ue1_0.kyc_verified=1
and as1_0.status='ACTIVE'
limit
?, ?
对于使用 LEFT JOIN
创建的查询 1 hibernate``` select
*
from
user_entity ue1_0
left join
cs_customer_status as1_0
on as1_0.user_id=ue1_0.user_id
where
ue1_0.email=? ```
如何强制 hibernate 生成左连接而不是仅在查询 2 中连接,这样我就可以获得没有 accountStatus 为 null 的用户
我期待 hibernate 在两个查询中生成左连接
您的第二个查询按预期工作
对于查询 1,您应该使用 HQL
@EntityGraph(attributePaths = {"accountStatus"})
@Query("SELECT u FROM User u WHERE u.kycVerified = true and u.email = :email and u.accountStatus.status = 'ACTIVE'")
Optional<User> findByEmail(@Param("email") String email);