![](/img/trans.png)
[英]Joining two table entities in Spring Data JPA with where clause
[英]how to update a table in spring data JPA using where clause
我想更新表中的特定记录,我正在使用主键 (empId) 和一列 (empSalary) 来标识特定列。 我们知道主键(empId)足以识别记录。 但是在我的情况下,如果该员工的薪水为 1000,我想更新记录。是否有任何选项可以使用实体不查询来更新记录?。 我正在使用弹簧数据 JPA
例子:
public class Employee {
@Id
@Column
private int empId;
@Column
private String name;
@Column
private float salary;
@Column
private String state;
// getters, setters
}
如果 empId 和工资与表匹配,我想更新整个表。
在EmployeeRepository
创建以下方法;
findOneByEmpIdAndSalary(Integer empId, Float salary);
然后你可以传递salary = 1000.0
或者可以在同一个存储库中使用硬编码的值创建一个默认方法;
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
Optional<Employee> findOneByEmpIdAndSalary(Integer empId, Float salary);
default Optional<Employee> findOneByEmpIdAndSalaryEqualTo1000(Integer empId) {
return findOneByEmpIdAndSalary(empId, 1000.0);
}
}
我使用findOne
因为您已经使用主键和额外条件进行了选择,因此您将获得一个或一个都没有,因此使用Optional<T>
作为结果,以更好的方式控制这两种可能性。
在@Transactional
状态中获取此实体后,只需更新结果实体。 如果Optional
不为空,则事务结束时会将更新提交到数据库,否则什么都不做。
@Transactional
public String updateWithCondition(Integer empId) {
employeeRepository.findOneByEmpIdAndSalaryEqualTo1000(empId)
.ifPresent(employee -> employee.setState("desired Update"));
}
以上面的代码片段为例。
您可以将@Modifying
与@Query
注释一起使用以在查询中包含 where 子句。 通过这种方式,您可以通过首先获取实体然后更新它来保存到 DB 的往返行程。
Baeldung 的 这篇文章很好地解释了它。 希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.