【发布时间】:2021-08-10 12:33:33
【问题描述】:
我必须通过确保它已经存在于数据库中来更新一个实体(主键不是自动生成的)。因此我不能只使用save() 方法来解决这个问题。必须有一种方法来确保插入的主键已经存在。要克服这个问题,我知道我可以采用以下几种方法。但我发现创建自己的更新语句是解决此问题的最佳方法。
所以我需要使用 JPQL 创建一个动态更新查询。我知道您会说为什么不使用getOne() 或findOne() 之类的方法并为实体和save() 设置必要的字段。但我认为使用findOne() 或getOne() 会导致额外的db hit 来获取相关实体。所以我可以通过自定义更新查询来省略获取。
我想使用@DynamicUpdate 也无法解决问题,因为据我所知,它还会从数据库中获取实体以在更新期间比较更改的字段。
因此,上述两种方法都会导致额外的数据库命中。
那么有没有办法编写一个自定义 jpql 查询来只更新不为空的字段。
我通过编写动态 where 子句实现了类似的获取行为。但没有找到对更新执行相同操作的方法。
例如使用 JPQL 进行动态选择:
SELECT d FROM TAndC 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)"
【问题讨论】:
标签: spring spring-boot hibernate spring-data-jpa jpql