【问题标题】:How to create a dyncamic update query with JPQL?如何使用 JPQL 创建动态更新查询?
【发布时间】: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


    【解决方案1】:
    @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);
    

    我写了一个伪代码。 使用弹簧数据是可能的。

    您还可以使用 jpa 实体管理器以编程方式创建更新语句和动态查询

    【讨论】:

    • 我需要做的是在更新语句中有一组动态字段,就像在我的 where 条件中一样。所以我只能更新作为方法参数传递的非 null 字段。请参考我发布的select语句。你可以看到我的where close后面是一组可以为null的属性。所以select语句将在not null属性下搜索结果。
    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2021-09-09
    • 1970-01-01
    • 2019-10-01
    • 2021-01-06
    • 2016-12-19
    相关资源
    最近更新 更多