spring-data-jpa Spring Data 只更新一个实体字段

wz8daaqr  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(289)

当我尝试只更新一个实体一个字段时,我注意到在日志中Hibernate执行了两个查询,在更新之前,它会对所有字段执行SELECT操作。这样可以吗?为什么Hibernate会执行SELECT操作?我如何才能只使用一个UPDATE查询来更新字段?此外,当我尝试更新一个实体中的单个标题时,如果该实体具有另一个嵌套实体,我最终会执行一系列SELECT操作。我觉得这对表演不好还是我错了?

Something s = somethingRepository.findById(id);
s.setField1(someData);
somethingRepository.save(s);

我在网上找到了一个用@Modifying和@Query(“UPDATE...”)进行自定义查询的解决方案,但是这样我需要对每个字段进行自定义查询,有没有更好的解决方案?

wr98u20j

wr98u20j1#

根据您粘贴在问题中的源代码

Something s = somethingRepository.findById(id);
s.setField1(someData);
somethingRepository.save(s);

如果你所请求的实体Something在休眠一级缓存中不存在,它将进行一次SELECT调用。
并且当您更新字段1的值时,它将进行另一个更新调用。您是否使用保存并不重要,因为Hibernate脏检查将确保所有更改都被更新。
否则你可以使用自定义的方法,用JPQL和命名的参数来修改。2它比?3 1更容易阅读,

@Modifying
@Query("UPDATE Something s SET s.field = :fieldValue WHERE s.id = :id")
void updateField(String fieldValue, UUID id);

关于您看到的多个呼叫“当我试图更新具有另一个嵌套实体的实体中的单个标题时”。这取决于您如何创建实体之间的关系。如果您可以共享实体及其关系,那么只有它才能得到准确的回答。

5us2dqdw

5us2dqdw2#

因为repository.save()方法在内部执行upsert。如果您转到内部类并检查,您将首先看到它,它将检查实体是否存在于数据库中,然后基于此执行添加或更新。如果您不希望运行SELECT查询,则可以使用JPA存储库提供的原生查询。您可以执行以下操作:

@Modifying
@Transactional
@Query("UPDATE <tableName> SET <columnName> = ?1 WHERE <condition>" ,nativeQuery=true)
void updateSomething(String value);

相关问题