Hibernate OnetoOne 映射加入问题

问题描述 投票:0回答:1

我创建了两个具有单向映射的实体

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 在两个查询中生成左连接

java spring-boot hibernate spring-data-jpa orm
1个回答
0
投票

您的第二个查询按预期工作

对于查询 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);
© www.soinside.com 2019 - 2024. All rights reserved.