SpringBoot + JPA的自學之路(三)多表連線查詢

大鍋睿發表於2018-12-20

上一節分享了一下JPA的基本操作,但是有時候這些基本操作並不能滿足業務的需求,用慣了Mybatis的我覺得多表查詢也是挺容易的一件事情,不用修改實體,自己寫sql非常的靈活也非常的方便,但是在JPA中要實現多表查詢就稍微麻煩一點,需要對實體進行修改,加上一些註解表示與其他實體的關聯關係(一對一、一對多、多對一,多對多),下面我們就通過例子來講解一下。

現在我們假設有這樣的一個需求:查詢一個使用者列表,列表的資訊有使用者的id、姓名等以及部門id和部門名稱,顯然之前的基本操作無法滿足我們現在的需求,一個型別的Repository只能返回對應型別的實體(我也覺得這樣才是合理的),現在我們不光需要查詢使用者表還有通過使用者表的部門id查詢對應的部門資訊,接下來說一下其中的一種解決方案。

有一種解決方案就是使用實體關聯的方式來實現連線查詢

修改之後的UserModel.java

package priv.cwr.model;


import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.persistence.*;

@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "t_user")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class UserModel extends BaseModel {

    /**
     * 使用者id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;

    /**
     * 使用者姓名
     */
    private String name;

    /**
     * 性別,1:男,2:女
     */
    private Integer gender;

    /**
     * 使用者電話
     */
    private String phone;

    /**
     * 備註
     */
    private String note;

    /**
     * 部門實體
     */
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "dept_id")
    private DeptModel dept;
//    /**
//     * 部門id
//     */
//    @Column(name = "dept_id")
//    private Long deptId;
}

現在將之前的dept_id欄位註釋掉,改為實體關聯,因為這裡是使用者和部門的多對一關聯,所以使用@ManyToOne@JoinColumn則表示的是關聯的欄位,這裡可以理解為外來鍵。

特別提醒:如果使用者對應的部門id為null則查詢出的部門實體也為null,如果通過部門id找不到對應的部門,則整個使用者也會返回null。

查詢結果如下

存在dept_id對應的部門

dept_id為空

查詢使用者列表(Pageable分頁)

現在已經初步達到了我們的要求,連線查詢出了使用者資訊以及對應的部門資訊,但是現在的問題是這樣查詢出來的實體都是所有的欄位,也許很多時候我們只需要其中的幾個欄位,就比如說這裡我們只需要部門的id和名稱,如果說部門表有幾十個甚至上百個欄位,毫無疑問這樣做是非常浪費時間以及資源的,所以這個時候我們可能會需要自定義一個滿足需求的物件即可,下一節會分享一下如何將查詢結果對映到自定義的物件中。

相關文章