Spring 如何使用JPQL创建动态更新查询?
我必须更新实体,确保它已经存在于数据库中(主键不是自动生成的)。因此,我不能只使用Spring 如何使用JPQL创建动态更新查询?,spring,spring-boot,hibernate,spring-data-jpa,jpql,Spring,Spring Boot,Hibernate,Spring Data Jpa,Jpql,我必须更新实体,确保它已经存在于数据库中(主键不是自动生成的)。因此,我不能只使用save()方法来解决此问题。必须有一种方法来确保插入的主键已存在。要解决此问题,我知道可以采用以下几种方法。但我发现创建自己的update语句是解决此问题的最佳方法 因此,我需要使用JPQL创建一个动态更新查询。我知道你会说为什么不使用像getOne()或findOne()这样的方法,为实体和save()设置必要的字段。但是我认为使用findOne()或getOne()导致额外的数据库命中以获取相关实体。因此,我
save()
方法来解决此问题。必须有一种方法来确保插入的主键已存在。要解决此问题,我知道可以采用以下几种方法。但我发现创建自己的update语句是解决此问题的最佳方法
因此,我需要使用JPQL创建一个动态更新查询。我知道你会说为什么不使用像getOne()
或findOne()
这样的方法,为实体和save()
设置必要的字段。但是我认为使用findOne()
或getOne()
导致额外的数据库命中以获取相关实体。因此,我可以通过使用自定义更新查询来忽略获取
我想使用@DynamicUpdate
也不能解决这个问题,因为据我所知,它还可以从数据库中获取实体,以便在更新期间比较更改的字段
因此,上述两种方法都会导致额外的db命中
因此,有没有一种方法可以编写一个自定义jpql查询,只更新不为null的字段
我通过编写动态where子句实现了类似的抓取行为,但没有找到一种方法来实现更新
使用JPQL动态选择的Ex:
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)"
我写了一个伪代码。
使用弹簧数据是可能的
您还可以使用jpa实体管理器以编程方式创建update语句和动态查询我需要做的是在update语句中有一组动态字段,就像在我的where条件中一样。因此,我只能更新作为参数传递给方法的字段,这些字段不能为null。请参阅我在发布。您可以看到my where close后面跟着一组可以为null的属性。因此select语句将在not null属性下搜索结果。
@Modifying
@Query("update entity e set e.obj1=:obj1 and e.obj2=:obj2 where e.id=:id")
public void updateCustom(String obj1, String obj2, String id);