springboot中使用jpa建立一对多关联表查询

springboot中使用jpa建立一对多关联表查询

本人比较小白,这是我自己在实际开发用碰到的问题
问题描述:工厂中有多条生产线,生产线中又包含多个机器人,如此生产线和机器人就是典型的一对多关系,之前我是将生产线和机器人放在一张表中,如此信息冗余繁杂,条理也不清晰,尤其是在后面做二级联动查询时会有些问题,所以我想到用一对多关联表查询

首先建立Line和Robot的实体类

Line的实体类

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "tbl_line1")
@Data
public class Line1 implements Serializable {
    @Id
    @GeneratedValue
    private Integer id;

    @Column
    private String linenum;


//  CascadeType.ALL是说主从表全面建立级联关系;fetch属性设置成FetchType.EAGER,是指加载规则是即时加载
    @Column
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "lineId")
    private List<Robot1> robot1s=new ArrayList<>();

    public Line1(String linenum) {
        this.linenum = linenum;
    }


    public Line1() {
    }

}

最关键的一步在于
①在Line实体类中放入要关联的Robot类,其意图为查询Line时,能够通过得到结果再进而获取对应Robot的信息,其一般实现的方法将关联表信息存入list中,如上图所示。
②一对多时使用@OnetToMany注解,注解中cascade = CascadeType.ALL即全面建立级联关系,fetch设置为即时加载。
③记得使用@JoinColmn写出两表连接的关键字。这样一来就可以直接取出来两表的结果,其效果等同于使用sql原生语句"select *from tbl_line1 as a left join tbl_robot1 as b on a.id=b.lineId",如果在JPA中使用原生sql语句查询,还需要根据结果集建立对应实体类,想想就很傻。

Robot的实体类

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "tbl_robot1")
@Data
public class Robot1 implements Serializable {
//  指定主键
//  设置Id自增长
//  机器人idh号
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

//  机器人名称
    @Column
    private String robotName;


//    机器人所在产线
    @Column
    private Integer lineId;


    public Robot1(String robotName, Integer lineId) {
        this.robotName = robotName;
        this.lineId = lineId;
    }


    public Robot1() {
    }


}

写line的repository类


import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface NewLineRepository extends JpaRepository<Line1,Integer> {
    List<Line1> findById(int id);
}

写controller中实现类

@Controller
public class WaterMonitorController {

    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    NewLineRepository newLineRepository;

    @RequestMapping("/water")
    public String view() {
        List<Line1> byId = newLineRepository.findById(1);
        System.out.println("根据id查询产线");
        System.out.println(byId);
        System.out.println("输出查询得到产线中的机器人");
        for (Line1 l:byId){
            List<Robot1> robot1s = l.getRobot1s();
            System.out.println(robot1s);
        }
        return "water/view.html";
    }
}

得到的输出如下所示
在这里插入图片描述

很简单很方便

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值