繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM