和 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語句都是物件導向的,對應的欄位都是實體類裡面的屬性