【问题标题】:how to update a table in spring data JPA using where clause如何使用 where 子句更新 Spring Data JPA 中的表
【发布时间】:2019-02-27 05:24:44
【问题描述】:

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

【问题讨论】:

  • 我的回答有帮助吗?请告诉我,如果不是,我可以提供更多帮助。你还没有接受它作为答案...

标签: java hibernate spring-data-jpa


【解决方案1】:

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&lt;T&gt; 作为结果,以更好的方式控制这两种可能性。

@Transactional 状态中获取此实体后,只需更新生成的实体即可。如果Optional 不为空,则事务结束时会将更新提交到数据库,否则什么都没有。

@Transactional
public String updateWithCondition(Integer empId) {
    employeeRepository.findOneByEmpIdAndSalaryEqualTo1000(empId)
            .ifPresent(employee -> employee.setState("desired Update"));
}

以上面的sn-p为例。

【讨论】:

    【解决方案2】:

    您可以使用 @Modifying@Query 注释在查询中包含 where 子句。这样,您可以通过先获取实体然后更新它来节省往返 DB。

    This 来自 Baeldung 的文章巧妙地解释了这一点。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2016-04-29
      • 2015-09-20
      • 1970-01-01
      • 2017-01-18
      • 2016-11-26
      • 2012-12-16
      • 2020-07-10
      • 2021-07-13
      相关资源
      最近更新 更多