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";
}
}
得到的输出如下所示
很简单很方便