我想更新表中的特定记录,并且我正在使用主键(empId)和另一个列(empSalary)来标识特定列。众所周知,主键(empId)足以识别记录。但是在我的情况下,如果该员工的薪水为1000,我想更新记录。是否可以使用不查询实体来更新记录?我正在使用Spring Data JPA
示例:
public class Employee {
@Id
@Column
private int empId;
@Column
private String name;
@Column
private float salary;
@Column
private String state;
// getters, setters
}
如果empId和薪水与表匹配,我想更新整个表。
答案 0 :(得分:3)
在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"));
}
以上面的代码段为例。
答案 1 :(得分:0)
您可以将@Modifying
与@Query
注释一起使用,以在查询中包含where子句。这样,您可以通过先获取实体然后进行更新来保存DB的往返行程。
This文章对其进行了巧妙的解释。希望对您有所帮助。