【发布时间】:2019-12-18 02:02:01
【问题描述】:
我有一个Project 实体,它具有以下属性:
@ManyToMany
@JoinTable(
name = "employee_projects",
joinColumns = @JoinColumn(name = "project_id"),
inverseJoinColumns = @JoinColumn(name = "employee_id")
)
private List<Employee> employees;
当我将另一个employee 添加到employees 时,我正在执行以下服务方法。
Employee addEmployeeToProject(long id, Employee employee) {
Project project = findByProjectId(id);
List<Employee> oldEmployees = project.getEmployees();
oldEmployees.add(employee);
project.setEmployees(oldEmployees);
projectRepository.save(project);
return employee;
}
效果很好。但后来我实际上开始记录 SQL 请求,这就是实际发生的情况:
2019-12-17 18:45:52.644 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : delete from employee_projects where project_id=?
2019-12-17 18:45:52.646 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.648 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.648 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.650 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.650 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.651 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.651 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.651 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.652 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.652 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.652 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.652 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.653 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.653 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
2019-12-17 18:45:52.653 DEBUG 14324 --- [nio-8080-exec-1] org.hibernate.SQL : insert into employee_projects (project_id, employee_id) values (?, ?)
所以他首先删除所有列(从给定项目中删除所有员工)。然后再次添加所有以前的+新的。我想如果我替换整个系列会发生什么。但我只需要插入一个对象,为了节省时间,我可以编写自己的插入查询,这样它只插入我想要插入的一名新员工,而不是删除所有内容并再次添加所有内容。但是除了编写自己的查询之外,还有更好的方法在一个请求/查询中完成吗?
编辑:
如果我使用本机查询,我只能定义 INSERT 查询吗? JPQL 不可以吗?
【问题讨论】: