多表查询在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());
    }

结果

java多表联查的实体 jpa多表联查_hibernate


测试多对一的添加

@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);
    }

结果

java多表联查的实体 jpa多表联查_java_02


java多表联查的实体 jpa多表联查_java_03


删除的话需要把@OneToMany注解里面的cascade属性值改成CascadeType.ALL或者是CascadeType.REMOVE即可

到这来就结束咯,快点去使用一下吧

java多表联查的实体 jpa多表联查_jpa_04