SpringBoot JPA查詢對映到自定義實體類

你啊347發表於2021-08-25

和 SegmentFault上的文章(https://segmentfault.com/a/1190000021869465)一樣, 都是俺賬號

場景

舉一個簡單的栗子:
比如有一個User實體類

@Data
@Entity
public class User{

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

private String userName;

private String password;

}

然後有一個Email的實體類

@Data
@Entity
public class Email{

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

private String account;

private String code;

private boolean active;

}

以及一個UserRelation實體類,用來維護其他表與User之間的關聯

@Data
@Entity
public class UserRelation{

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

private Long userId;

private Long emailId;

}

每個實體類都有其對應的Repository介面,用來實現CRUD。

最後有一個領域類UserPo

@Data
@Entity
public class UserPo{

private String userName;

private String account;

}

那麼這個時候在UserRelationRepository裡建立一個 findUserPo( Long userId )方法,如何讓findUserPo可以返回一個UserPo物件呢?

public interface UserRelationRepository extends JpaRepository<UserRelation, Long> {

UserPo findUserPo(Long id);

}

實現

JPA可以自定義SQL語句進行查詢,然後查詢語句可以通過原生SQL語句(原生SQL語句要在@Query註解里加 nativeQuery = true)進行查詢也可以通過JPQL進行查詢。

這裡通過 JPQL(Java Persistence Query Language) 進行查詢,其特徵與原生SQL語句類似,並且完全物件導向,通過類名和屬性訪問,而不是表名和表的屬性。

由此findUserPo修改之後就像這樣

public interface UserRelationRepository extends JpaRepository<UserRelation, Long> {

// 注意這裡沒有nativeQuery = true
@Query(value = "SELECT new com.xxx.xxx.bean.po.UserPo(u.userName, e.account) "+
"FROM UserRelation ur JOIN User u ON ur.userId = u.id"+
"JOIN Email e ON ur.emailId = e.id WHERE ur.userId = ?1 ")
UserPo findUserPo(Long id);

}
  • 這樣就可以在查詢的時候返回值自定義實體類了

  • 注意上面的SQL語句都是物件導向的,對應的欄位都是實體類裡面的屬性

相關文章