【问题标题】:Does having a custom update query with WHERE clause gives more performance while updating in Spring Data JPA?在 Spring Data JPA 中进行更新时,使用 WHERE 子句进行自定义更新查询是否会提供更高的性能?
【发布时间】:2021-08-10 11:00:18
【问题描述】:

假设我有一个名为 Car 的实体。现在实体的主键不是自动生成的 Id。假设我需要用一组值更新我的汽车实体。但问题是我需要确保给定的 ID 已经存在于数据库中。因为我知道在 Spring Data JPA 中我们使用 save() 方法来保存和更新现有实体。

然后在为save() 方法插入新主键的情况下将导致保存,否则它将更新该特定实体。所以我总是需要确保在更新期间该方法不会为无效的 ID。

因此,为了克服这个问题,我看到许多开发人员在更新之前使用find() 方法调用来确保给定的主键已经存在。但是您可以看到将有一个额外的数据库命中来确保这一点。

所以为了克服这个问题,我想到了使用自定义更新查询。然后我可以通过在 JPARepository 中将它的返回类型声明为 int 来确定查询是否被执行。所以根据我的知识查询将输出 1 表示成功,0 表示更新失败。

所以我需要知道的是,在为方法updateCar() 提供不存在的主键的情况下,我是否可以始终确保更新不会因为主键无效而成功。我的意思是如果更新由于其他错误而失败会发生什么?

本次讨论的最终目的是避免在更新前检查主键是否存在。所以如果有更好的方法请说明。

例如:

    @Modifying
    @Query("UPDATE Car c SET c.status =:status WHERE c.id =:id")
    int updateCar(@Param("status") String status, @Param("id") String id);

【问题讨论】:

    标签: java spring-boot hibernate jpa spring-data-jpa


    【解决方案1】:

    您从更新中返回的 int 是更新的行数。

    所以我需要知道的是,在提供不存在的情况下 updateCar() 方法的主键我可以始终确保 由于无效的主键,更新没有成功。我是说 如果由于其他错误导致更新失败会怎样?

    如果由于任何其他原因更新失败,那么您将收到异常。

    您的解决方案的问题是您必须为每个用例编写更新语句。

    【讨论】:

    • 你是 100% 正确的,我在应用程序日志的帮助下分析了行为。我看到查询在违反约束等情况下抛出异常。那么有什么方法可以编写动态 jpql 查询来克服这个问题。我的意思是我在我的应用程序中编写了动态查询,如SELECT d FROM DbpTAndC d WHERE (:termStatus is null or d.termStatus= :termStatus ) AND (:termType is null or d.termType=:termType) AND (:termVersion is null or d.termVersion=:termVersion)"。有没有办法对更新做同样的事情。
    • 如果我假设我无法编写动态更新查询,我想在更新实体中的特定列的情况下,我的建议仍然更好。我的意思是,如果我们有一种方法在其处理过程中始终使用一列进行更新,那么当涉及到性能时,即使我们必须编写额外的查询,我想我的建议会更好。我说得对吗?
    • 如果你想编写自己的选择、插入和更新查询,你可以看看jooq.org Hibernate 是创建使用实体而不是创建 sql
    • 我想 JPQL 和 HQL 可以完全满足这个要求。我们不能像我已经实现的选择那样通过那些语言实现动态更新吗?
    • 您必须在更新中编写 CASE 语句
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多