• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Spring Data JPA多表查詢

    標簽: spring boot

    多表查詢在Spring Data JPA中有兩種實現方式
    第一種創建一個結果集接口來接收多表連查的結果
    第二種利用JPA的關聯映射來實現

    先來熟悉一下幾個注解

    注解 意思 屬性
    @ManyToOne 定義了連接表之間的多對一的關系。 targetEntity屬性表示關聯的實體類型,可省略,fetch屬性表示加載策略,FetchType的取值范圍LAZY(延遲加載)默認上EAGER,cascade屬性表示級聯操作,CascadeType取值范圍PERSIST(級聯持久化),REMOVE(級聯刪除),ALL(級聯所以操作)…等,一般不推薦使用ALL,風險較大,cascade屬性一般不在多對一的地方使用,通常在一對多地方使用
    @JoinColumn 指定一個實體組織或實體的集合。這是用在多對一和一對多關聯。 name屬性表示外鍵的字段名稱
    @OneToMany 定義了連接表之間存在一個一對多的關系。 具有@ManyToOne注解的屬性,還有mappedby屬性用來設置對象之間的關系維護方

    這里只是列出了JPA進行多表查詢的注解,如果對普通的JAP注解不了解的可以去看一下這篇相關的博客
    什么是JPA、JPA的基礎實戰

    話不多說,直接上代碼,讓老夫來瞎操作一波
    先上兩個實體類,用戶類,角色類,這里不建議使用@Data的注解,不然會出現堆棧溢出的異常
    大家在看實體類的時候一定要認真看哦,看清楚使用了哪些注解以及屬性
    用戶類

    import javax.persistence.*;
    import java.io.Serializable;
    
    @Entity
    @Table(name = "sys_user")
    public class SysUser implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long userId;
        private String userName;
        private String userPassword;
    
        private long userFlag;
    
        @ManyToOne(targetEntity = SysRole.class)
        @JoinColumn(name = "user_role_id")
        private SysRole sysRole;
    
        public long getUserId() {
            return userId;
        }
    
        public void setUserId(long userId) {
            this.userId = userId;
        }
    
        public SysRole getSysRole() {
            return sysRole;
        }
    
        public void setSysRole(SysRole sysRole) {
            this.sysRole = sysRole;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserPassword() {
            return userPassword;
        }
    
        public void setUserPassword(String userPassword) {
            this.userPassword = userPassword;
        }
    
        public long getUserFlag() {
            return userFlag;
        }
    
        public void setUserFlag(long userFlag) {
            this.userFlag = userFlag;
        }
    
    
        public SysUser(String userName, String userPassword, long userFlag, SysRole sysRole) {
            this.sysRole = sysRole;
            this.userName = userName;
            this.userPassword = userPassword;
            this.userFlag = userFlag;
        }
    
        public SysUser() {
        }
    }
    
    

    角色類

    import javax.persistence.*;
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    
    @Entity
    @Table(name = "sys_role")
    public class SysRole {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long roleId;
        private String roleName;
        private String roleDesc;
        private long roleFlag;
    
        @OneToMany(targetEntity = SysUser.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "sysRole")
        private Set<SysUser> sysUsers = new HashSet<SysUser>();
    
        public Set<SysUser> getSysUsers() {
            return sysUsers;
        }
    
        public void setSysUsers(Set<SysUser> sysUsers) {
            this.sysUsers = sysUsers;
        }
    
        public long getRoleId() {
            return roleId;
        }
    
        public void setRoleId(long roleId) {
            this.roleId = roleId;
        }
    
        public String getRoleName() {
            return roleName;
        }
    
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    
    
        public String getRoleDesc() {
            return roleDesc;
        }
    
        public void setRoleDesc(String roleDesc) {
            this.roleDesc = roleDesc;
        }
    
        public long getRoleFlag() {
            return roleFlag;
        }
    
        public void setRoleFlag(long roleFlag) {
            this.roleFlag = roleFlag;
        }
    
    
        public SysRole(String roleName, String roleDesc, long roleFlag) {
            this.roleName = roleName;
            this.roleDesc = roleDesc;
            this.roleFlag = roleFlag;
        }
    
        public SysRole() {
        }
    }
    

    創建SysRoleRepository接口和SysUserRepository接口
    SysUserRepository接口

    public interface SysUserRepository extends JpaRepository<SysUser,Long> {}
    

    SysRoleRepository接口

    public interface SysRoleRepository  extends JpaRepository<SysRole,Long> {}
    

    測試基本的CRUD
    測試多對一查詢

      	@Autowired
        SysUserRepository sysUserRepository;
    
        @Test
        public void testFindById() {
            SysUser sysUser = sysUserRepository.findById(18L).get();
            System.out.println("userName:" + sysUser.getUserName());
            System.out.println("roleName:" + sysUser.getSysRole().getRoleName());
        }
    

    結果
    在這里插入圖片描述
    測試多對一的添加

      @Autowired
      SysRoleRepository sysRoleRepository;
    
      @Test
        public void testAdd() {
            SysRole sysRole = new SysRole("test","001",1);
            SysUser sysUser = new SysUser("test","1234567",1,sysRole);
            sysRole.getSysUsers().add(sysUser);
            sysRoleRepository.save(sysRole);
        }
    

    結果
    在這里插入圖片描述
    在這里插入圖片描述
    刪除的話需要把@OneToMany注解里面的cascade屬性值改成CascadeType.ALL或者是CascadeType.REMOVE即可

    到這來就結束咯,快點去使用一下吧

    在這里插入圖片描述

    版權聲明:本文為liuduke1原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/liuduke1/article/details/108305313

    智能推薦

    Spring Data JPA進階(三):Specification查詢

    Spring Data JPA支持非常豐富的查詢方式,本文主要介紹Specification查詢。 JPA 2 規范引進了criteria查詢API。Spring Data JPA對此提供了支持。如果你想使用這個功能,只需要繼承JpaSpecificationExecutor接口。這個接口已經實現了基本的查詢方法(findOne,findAll,count等)。 JpaSpecificationE...

    Spring Data JPA之動態查詢

    在日常工作中,Spring Data JPA的使用給我們帶來了極大的方便,但是實際業務中很多場景需要支持動態查詢。比如前端查詢功能提供了很多查詢條件,用戶可以根據一部分條件進行查詢,那么后端就需要支持可配置的查詢服務。在使用mybatis等時,可以用動態查詢的方式輕松搞定,但是對于初次使用Spring Data JPA的小白來說,著實有些困難。本人也是在實際工作中參考資料,一步步摸索,掌握了一定的...

    Spring Data JPA復雜動態查詢

    Spring Data JPA其諸多優點給我們的工作帶來了很多便利,但對于接觸不久的同學來說,有些情況讓我們頭疼。一些復雜的查詢,比如涉及到聚合函數、動態多條件等,著實有些棘手。在不夠了解的情況下,覺得Spring Data JPA在這方面不太人性化,有時候我們干脆使用原生sql粗暴的來解決這類查詢問題。但這與Spring Data JPA的初衷是相悖的,在不斷的學習中,慢慢發現Spring Da...

    Spring-Data-Jpa條件查詢

    Spring-Data-Jpa條件查詢 按照SpringData的規則,可以通過定義在Repository接口下的方法名稱來執行查詢等操作,查詢的方法名稱必須以find、get、read、開頭,同時,涉及條件查詢時,SpringDataJpa支持將條件屬性定義在數據訪問層接口下的方法名稱中,條件屬性通過條件關鍵字鏈接。需要注意的是:條件屬性的首字母必須大寫,下面來看一個案例吧。 1、創建一個spr...

    spring data jpa實現分頁查詢功能

    spring data jpa實現分頁查詢功能 HTML代碼部分: Action類: Service代碼: dao層:...

    猜你喜歡

    LeetCode153 尋找旋轉排序數組中的最小值(二分)

    題目鏈接:leetcode153 題面 題目大意 題目中的旋轉可以理解成整個有序數組循環左移,找旋轉點相當于找這個左移的開頭,由于原序列有序,相當于找數組的最小值。數組中的元素不重復! 解題思路 暴力 遍歷一次數組,尋找最小值。 時間復雜度 O ( n ) O(n) O(n) ,空間復雜度 O ( 1 ) O(1) O(1)。 二分 由于原序列有序,根據左移的特性,我們可以進行二分: 如果 mid...

    微信小程序—canvas截取任意形狀

    最近在研究拼圖驗證碼實現,需要對圖片的部分模塊進行特殊形狀切割出一小塊,明白后原來是如此簡單,第一步就是將所有繪制的形狀用線勾出(直線、弧線、貝塞爾曲線都可以)形成閉環,第二步就是切割繪制,第二步不麻煩,麻煩的只是第一步,需要一些計算,所以會在以后,盡力的多保存一些特殊形狀的方法。 比如: 代碼 體驗...

    從Linux內核角度看InnoDB同步機制的實現(上)

    Author: bugall Wechat: bugallF Email: [email protected] Github: https://github.com/bugall 一:引子 InnoDB是符合MVCC(Multi-Version Concurrency Control)規范的,通俗的講就是寫加鎖,讀不加鎖,讀寫不沖突(有些情況下是不符合MVCC的,比如當isolation級別為ser...

    寫給Java程序員看的Redis教程-------第一章. Redis簡介

    1、Redis簡介 ? 對于一個稍有經驗的程序員,都應知道:內存條的讀寫速度是遠高于硬盤的讀寫速度的,而在以往的數據庫中,我們往往以硬盤為主,這樣導致了讀寫硬盤頻繁,系統效率低下,而Redis則是以內存為主,讀寫都盡可能的發生在內存中。 舉個例子:在剛開始學習Java語言的時候,小松還沒學到數據庫,可是他需要保存數據,于是自己寫了一個文件管理API,供自己使用。(弱化版的數據庫) 后來,他發現因為...

    精品国产乱码久久久久久蜜桃不卡