Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何使用JPQL创建动态更新查询?_Spring_Spring Boot_Hibernate_Spring Data Jpa_Jpql - Fatal编程技术网

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);