Java 在Spring数据JPA中进行更新时,使用WHERE子句进行自定义更新查询是否会提高性能?

Java 在Spring数据JPA中进行更新时,使用WHERE子句进行自定义更新查询是否会提高性能?,java,spring-boot,hibernate,jpa,spring-data-jpa,Java,Spring Boot,Hibernate,Jpa,Spring Data Jpa,假设我有一个实体叫做汽车。现在实体的主键不是自动生成的Id。假设我需要用一组值更新我的car实体。但问题是我需要确保给定Id已经存在于数据库中。因为我知道在SpringDataJPA中,我们使用save()方法来保存和更新现有实体 然后,在为save()方法插入新主键的情况下,将导致保存,否则将更新该特定实体。因此,在更新过程中,我始终需要确保该方法不会为无效ID创建新实体 因此,为了克服这个问题,我看到许多开发人员在更新之前使用find()方法调用,以确保给定的主键已经存在。但是您可以看到,将

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

然后,在为
save()
方法插入新主键的情况下,将导致保存,否则将更新该特定实体。因此,在更新过程中,我始终需要确保该方法不会为无效ID创建新实体

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

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

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

本讨论的最终目标是避免在更新之前检查主键的存在。因此,如果有更好的方法,请说明

例:


从更新中得到的int是更新的行数

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

如果更新因任何其他原因失败,则会出现异常


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

您完全正确,我在应用程序日志的帮助下分析了该行为。我看到查询抛出了约束冲突等情况的异常。那么有没有办法编写动态jpql查询来克服这个问题。我的意思是,我编写了动态where查询,如
SELECT d FROM dbpta和c d where(:termStatus为null或d.termStatus=:termStatus)和(:termType为null或d.termType=:termType)和(:termVersion为null或d.termVersion=:termVersion)“
在我的应用程序中。是否有方法对更新执行相同操作。如果我假设我无法编写动态更新查询,我想在更新实体中的特定列时,我的建议还是更好。我的意思是,如果我们有一个方法,在它的过程中总是使用一列进行更新,那么在性能方面,即使我们必须编写一个额外的查询,我想我的建议更好。我是对的吗?如果您想编写自己的选择,插入和更新查询您可能已经了解了Hibernate是为了使用实体而创建的,而不是为了创建sqlI。我猜JPQL和HQL是为了完全满足这个需求。我们不能通过那些语言实现动态更新,比如我已经实现了select。你必须在更新中编写CASE语句
    @Modifying
    @Query("UPDATE Car c SET c.status =:status WHERE c.id =:id")
    int updateCar(@Param("status") String status, @Param("id") String id);