我在尝试使用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”
我正在寻找一些文档或例子,可以帮助我找到解决方案。先谢谢你。
1条答案
按热度按时间wj8zmpe11#
我认为您遇到的直接问题是不正确地强制转换传入字段。
:errors ::jsonb
有一个空格,因此它将::
转换操作视为单独的标记。然而,JPA会被:errors::jsonb
卡住(我怀疑您已经发现了)。在这样的查询中进行postgres强制转换有两种方法:
1.脱掉冒号:
:error\\:\\:jsonb
1.使用
cast
函数:cast(:error as jsonb)
不过
还有一个更好的解决方案,那就是在您的实体中使用为
jsonb
设计的Hibernate类型。通常接受的解决方案是这样的:vladmihalcea / hibernate-types