如何使用where子句更新spring数据JPA中的表

时间:2019-02-27 05:24:44

标签: java hibernate spring-data-jpa

我想更新表中的特定记录,并且我正在使用主键(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和薪水与表匹配,我想更新整个表。

2 个答案:

答案 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的往返行程。

Baeldung的

This文章对其进行了巧妙的解释。希望对您有所帮助。