SpringData JPA多表查詢返回自定義的實體

       在使用SpringData JPA查詢的時候,一般都是返回Entity相關的結果。前段時間,在開發的 時候遇到了2個表聯合查詢,返回自定義的實體類,這個問題樓主也是查了好多資料,才得以解決,現在分享給大家,不足之處,敬請之出。

2個實體類UserInfo、UserLoginInfo 分別對應mysql的表user_info和user_login_info,實體類只截取了部分字段

@Data
@Entity
@Table(name = "user_info")
@JsonSerialize
public class UserInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private String uuid;

    @Column(name = "usr_sys_id")
    private String usrSysId;//用戶號

    @Column(name = "reg_time")
    private String regTime;//註冊時間
}
@Table(name = "user_login_info")
@Entity
@Data
@JsonSerialize
public class UserLoginInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private Long uuid;

    @Column(name = "usr_sys_id")
    private String usrSysId;//用戶號

    private String email; //郵箱

    @JsonIgnore
    @Column(name = "email_valid_stat")
    private String emailValidStat;// 郵箱狀態

    @JsonIgnore
    @Column(name="user_type")
    private String userType;//用戶類型
}

自定義的實體類UserInfoVo

@Data
@AllArgsConstructor
@JsonSerialize
public class UserInfoVo {
    
    private String usrSysId;
    
    private String email;
    
    private String loginName;
    
    private Integer stat;
    
    private String lstSuccTime;
    
    private String nationCode;
    
    private String phone;
    
    private String gender;

}

現在要根據usr_sys_id和usr_type兩個字段,聯表user_info和user_login_info查詢用戶相關的信息,返回類型結果是 UserInfoVo,

public interface UserLoginInfoRepository extends JpaRepository<UserLoginInfo, Long> {

    Optional<UserLoginInfo> findByUsrSysId(String usrSysId);

    @Query(value = "SELECT new com.hylj.hust.vo.UserInfoVo( " +
            "uli.usrSysId , uli.email, uli.loginName, uli.stat, uli.lstSuccTime, ui.nationCode, ui.phone, ui.gender) " +
            "FROM UserLoginInfo uli inner join  UserInfo ui ON  " +
            "uli.usrSysId = ui.usrSysId AND uli.userType= :userType AND uli.usrSysId = :usrSysId", nativeQuery = false)
    Optional<UserInfoVo> findByUsrSysIdAndUserType(@Param("usrSysId") String usrSysId, @Param("userType") String userType);
}

需要 注意的是,new com.hylj.hust.vo.UserInfoVo 此處應該寫全類名,nativeQuery 要設置爲false

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章