中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?JPA聯表查詢之OneToOne源碼分析

發布時間:2023-04-26 16:04:04 來源:億速云 閱讀:100 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring JPA聯表查詢之OneToOne源碼分析”,在日常操作中,相信很多人在Spring JPA聯表查詢之OneToOne源碼分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring JPA聯表查詢之OneToOne源碼分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    源碼

    @OneToOne 注解實現一對一關系映射。比如用戶跟車輛的關系(這里假設一個人只能有一輛車),一個用戶只能對應一輛車,而一輛車同樣只能對應一個用戶。
    老規矩,在實例之前,我們先看看源碼:

    public @interface OneToOne {
        Class targetEntity() default void.class;
        CascadeType[] cascade() default {};
        FetchType fetch() default EAGER;
        String mappedBy() default "";
        boolean orphanRemoval() default false;
    }

    注解屬性

    • targetEntity:(可選)表示默認關聯的實體類型,默認為當前標注的實體類

    • cascade:(可選)當前類對象操作后級聯對象的操作。默認為不級聯任何操作。

    • fetch:(可選)關聯是否延遲加載或者立刻加載。立刻加載是立刻獲取關聯的實體;延遲加載是表示關系類在被訪問時才加載。默認值EAGER,也就是立刻加載。

    • mappedBy:(可選)擁有關聯關系的域,如果關系是單向的就不需要;如果是雙向關系表,那么擁有關系的這一方有建立、解除和更新與另一方關系的能力,而另一方沒有,只能被動管理,這個屬性被定義在關系的被擁有方

    • orphanRemoval:(可選)是否將刪除操作應用于具有已從關系中刪除,并將刪除操作級聯到這些實體。

    單向聯表

    我這里所說的單向聯表就是只有一方添加注解;通俗講就是我可以通過 user 獲取到其 car 的信息,而不同通過 car 獲取到其 user 的信息。

    user 實體類

    @Entity
    @Data
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
        private int age;
        @OneToOne
        @JoinColumn(name = "car_id")
        private Car car;
    }

    car 實體類

    @Data
    @Entity
    public class Car {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
    }

    執行請求 /user/findById?id=1,控制臺打印如下:

    Hibernate: 
        select
            user0_.id as id1_1_0_,
            user0_.age as age2_1_0_,
            user0_.car_id as car_id4_1_0_,
            user0_.name as name3_1_0_,
            car1_.id as id1_0_1_,
            car1_.name as name2_0_1_ 
        from
            user user0_ 
        left outer join
            car car1_ 
                on user0_.car_id=car1_.id 
        where
            user0_.id=?

    查詢結果

    Optional[User(id=1, name=lili, age=11, car=Car(id=1, name=蘇A00001))]

    從上面的 JPQL 語句我們可以發現,uer 表car 表 是通過left outer jion進行連接的。這樣我們可以通過查詢 user 信息來獲取其使用的 car 信息。

    雙向聯表

    我們除了需要通過 user 信息來獲取其 car 信息為,有時還需要通過 car 信息來獲取其 user 信息。只要再在 car 的實體中添加 user 字段,并添加@OneToOne注解。

    user 實體

    @Entity
    @Data
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
        private int age;
        @OneToOne
        @JoinColumn(name = "car_id")
        @JsonIgnore
        private Car car;
    }

    car 實體

    @Entity
    @Data
    public class Car {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
        @OneToOne
        @JoinColumn(name = "user_id")
        @JsonIgnore
        private User user;
    }

    執行請求 /car/findById?id=1,控制臺打印如下:

    Hibernate: 
        select
            car0_.id as id1_0_0_,
            car0_.name as name2_0_0_,
            car0_.user_id as user_id3_0_0_,
            user1_.id as id1_2_1_,
            user1_.age as age2_2_1_,
            user1_.car_id as car_id4_2_1_,
            user1_.name as name3_2_1_,
            car2_.id as id1_0_2_,
            car2_.name as name2_0_2_,
            car2_.user_id as user_id3_0_2_ 
        from
            car car0_ 
        left outer join
            user user1_ 
                on car0_.user_id=user1_.id 
        left outer join
            car car2_ 
                on user1_.car_id=car2_.id 
        where
            car0_.id=?

    查詢結果

    Optional[Car(id=1, name=蘇A00001, user=com.example.sbjdemo.pojo.User@1c0775ea)] 用戶信息可以通過后面的實體類獲取

    延遲加載(懶加載)

    上面是 OneToOne 的情形,所以請求出來的數據也是比較有限的。試想一下,如果是 OneToMany,而我們只想獲取 one 的信息,但是 many 的數據卻跟著一起請求出來的,無論是從數據上還是性能上來講,都是一種負擔。那么,有沒有一種方法,讓我們能夠只獲取 one 的信息,而對于 many 可以動態獲取呢?這時,我們想到了源碼中一個 fetch 方法,他好像可以使用 LAZY 屬性來控制數據懶加載。廢話少說,上碼。

    user 實體

    User 實體類上的 Car 屬性中 @OneToOne 添加屬性 fetch = FetchType.LAZY

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "car_id")
    @JsonIgnore
    private Car car;

    執行請求 /user/findById?id=1,控制臺打印如下:

    Hibernate: 
        select
            user0_.id as id1_2_0_,
            user0_.age as age2_2_0_,
            user0_.car_id as car_id4_2_0_,
            user0_.name as name3_2_0_ 
        from
            user user0_ 
        where
            user0_.id=?

    查詢結果:

    Optional[com.example.sbjdemo.pojo.User@30c311e6] 通過控制臺可以看出,只有一個用戶查詢的 sql,結果也就是一個 user 的實體類數據。那我們的 car 信息該如何查看呢?其實我們可以使用查詢結果 resultget 我們所需要的數據,如下圖所示:

    Spring?JPA聯表查詢之OneToOne源碼分析

    查詢完會發現,控制臺又打印了一個 JPQL:

    Hibernate: 
        select
            car0_.id as id1_0_0_,
            car0_.name as name2_0_0_,
            car0_.user_id as user_id3_0_0_,
            user1_.id as id1_2_1_,
            user1_.age as age2_2_1_,
            user1_.car_id as car_id4_2_1_,
            user1_.name as name3_2_1_ 
        from
            car car0_ 
        left outer join
            user user1_ 
                on car0_.user_id=user1_.id 
        where
            car0_.id=?

    恍然大悟,原來還是通過 sql 去完成的。

    到此,關于“Spring JPA聯表查詢之OneToOne源碼分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    肇庆市| 无为县| 景洪市| 嘉善县| 东兰县| 柘城县| 山阴县| 湾仔区| 遂溪县| 榕江县| 象州县| 北辰区| 湖口县| 萨迦县| 侯马市| 客服| 嘉黎县| 阿尔山市| 泌阳县| 海晏县| 葵青区| 东乌珠穆沁旗| 南召县| 六枝特区| 怀柔区| 白沙| 城固县| 松桃| 云林县| 堆龙德庆县| 伽师县| 叙永县| 威海市| 任丘市| 清新县| 微山县| 靖州| 贵州省| 日照市| 浑源县| 西贡区|