当我尝试只更新一个实体一个字段时,我注意到在日志中Hibernate执行了两个查询,在更新之前,它会对所有字段执行SELECT操作。这样可以吗?为什么Hibernate会执行SELECT操作?我如何才能只使用一个UPDATE查询来更新字段?此外,当我尝试更新一个实体中的单个标题时,如果该实体具有另一个嵌套实体,我最终会执行一系列SELECT操作。我觉得这对表演不好还是我错了?
Something s = somethingRepository.findById(id);
s.setField1(someData);
somethingRepository.save(s);
我在网上找到了一个用@Modifying和@Query(“UPDATE...”)进行自定义查询的解决方案,但是这样我需要对每个字段进行自定义查询,有没有更好的解决方案?
2条答案
按热度按时间wr98u20j1#
根据您粘贴在问题中的源代码
如果你所请求的实体Something在休眠一级缓存中不存在,它将进行一次SELECT调用。
并且当您更新字段1的值时,它将进行另一个更新调用。您是否使用保存并不重要,因为Hibernate脏检查将确保所有更改都被更新。
否则你可以使用自定义的方法,用JPQL和命名的参数来修改。2它比?3 1更容易阅读,
关于您看到的多个呼叫“当我试图更新具有另一个嵌套实体的实体中的单个标题时”。这取决于您如何创建实体之间的关系。如果您可以共享实体及其关系,那么只有它才能得到准确的回答。
5us2dqdw2#
因为repository.save()方法在内部执行upsert。如果您转到内部类并检查,您将首先看到它,它将检查实体是否存在于数据库中,然后基于此执行添加或更新。如果您不希望运行SELECT查询,则可以使用JPA存储库提供的原生查询。您可以执行以下操作: