Spring Boot Spring Data JPA Postgres jsonb列插入/更新

fdx2calv  于 2022-10-23  发布在  Spring
关注(0)|答案(1)|浏览(176)

我在尝试使用jsonb列更新postgres表上的记录时遇到了困难。
我试图用Spring Boot和JPA做的是在Postgres上运行一个不错的声明:

UPDATE data_report 
SET error_details  = error_details || '[{"error": "testError","record": {"start":"14:00","end":"20:00","id":"AAAA001","date":"2022-01-31"}}]'::jsonb
WHERE id = 91;

我已经尝试使用Native Query:

@Transactional
   @Modifying
   @Query(value = "UPDATE data_integration_report SET error_details = error_details || :errors ::jsonb WHERE id = :id", nativeQuery = true)
    void updateErrorDetail(@Param("id") Long id, @Param("errors") String errors);

但是我收到错误,说语法不正确,因为::jsonb无法识别
我已尝试使用EntiyManager

entityManager.createNativeQuery(
       "UPDATE data_integration_report SET error_details = error_details || :errors ::jsonb WHERE id = :id"
        ).setParameter("id", 91L)
        .setParameter("errors", data)
        .executeUpdate();

即使在这里,我也在语法上遇到错误。我还试图删除**::jsonb**强制转换,但我收到了这个错误:“Column is type of jsonb但Expression is type of Text”
我正在寻找一些文档或例子,可以帮助我找到解决方案。先谢谢你。

wj8zmpe1

wj8zmpe11#

我认为您遇到的直接问题是不正确地强制转换传入字段。

@Transactional
@Modifying
@Query(value = "UPDATE data_integration_report SET error_details = error_details || :errors ::jsonb WHERE id = :id", nativeQuery = true)
void updateErrorDetail(@Param("id") Long id, @Param("errors") String errors);

:errors ::jsonb有一个空格,因此它将::转换操作视为单独的标记。然而,JPA会被:errors::jsonb卡住(我怀疑您已经发现了)。
在这样的查询中进行postgres强制转换有两种方法:
1.脱掉冒号::error\\:\\:jsonb
1.使用cast函数:cast(:error as jsonb)

不过

还有一个更好的解决方案,那就是在您的实体中使用为jsonb设计的Hibernate类型。通常接受的解决方案是这样的:vladmihalcea / hibernate-types

相关问题