前言
在使用JPA
进行数据库访问时,可能会遇到n+1问题,也就是在查询关联实体时,jpa会额外执行查询操作,使用EntityGraph
时,这是JPA推出优化解决效率问题的注解,EntityGraph
则直接在查询语句的时候,直接用到用到Left Join,优化了数据库的性能
JPA关联表
实体类
定义一个实体类
less
@Data
@Entity
@FieldNameConstants
@Table(name = "machine_room")
@NamedEntityGraph(name = "MachineRoom.machineRoomInformationList", attributeNodes = {
@NamedAttributeNode(value = "machineRoomInformationList"),
})
public class MachineRoom {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String projectName;
@OneToMany(mappedBy = "machineRoom", cascade = CascadeType.ALL)
private List<MachineRoomInformation> machineRoomInformationList;
}
关联实体类
less
@Data
@Entity
@FieldNameConstants
@Table(name = "machine_room_information")
public class MachineRoomInformation {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String attributeKey;
private String attributeValue;
@ManyToOne
@JoinColumn(name = "machine_room_id")
private MachineRoom machineRoom;
}
定义dao层
java
public interface IMachineRoomRepository extends JpaRepository<MachineRoom, Long> {
@Transactional(rollbackFor = Exception.class)
void deleteByIdIn(List<Long> ids);
List<MachineRoom> findByIdIn(List<Long> ids);
}
数据库插入一条数据

接口
typescript
@GetMapping("/hello3")
public String hello3() {
List<MachineRoom> machineRoomList = iMachineRoomRepository.findByIdIn(List.of(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 102L));
MachineRoomDto machineRoomDto = new MachineRoomDto();
for (MachineRoom machineRoom : machineRoomList) {
BeanUtils.copyProperties(machineRoom, machineRoomDto);
}
return "success";
}
会发两条sql语句
加上
@EntityGraph
注解
java
public interface IMachineRoomRepository extends JpaRepository<MachineRoom, Long> {
@Transactional(rollbackFor = Exception.class)
void deleteByIdIn(List<Long> ids);
@EntityGraph(value = "MachineRoom.machineRoomInformationList")
List<MachineRoom> findByIdIn(List<Long> ids);
}
会产生一条left join语句

总结
使用EntityGraph
可以加快级联查询