JPA 和 JSON 运算符本机更新查询

Posted

技术标签:

【中文标题】JPA 和 JSON 运算符本机更新查询【英文标题】:JPA and JSON operator native update query 【发布时间】:2019-09-19 15:52:26 【问题描述】:

我正在尝试让这个查询在 JPA 中工作:

UPDATE billing_log_criteria
SET value = jsonb_set(value, 'cubPersonId', '"12778269"')
where value ->> 'cubPersonId' = '12778268';

它与 postgresql 完美配合,但是当我将它与 JPA 集成时,我收到以下错误:

原因:org.postgresql.util.PSQLException: ERROR: function jsonb_set(jsonb, unknown, character varying) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

以下是我尝试过的查询

@Modifying(clearAutomatically=false)
@Transactional
@Query(value = "UPDATE billing_log_criteria "
        + "SET value = jsonb_set(value, 'cubPersonId',  jsonb_set(value, 'cubPersonId', :newId)) "
        + "where value ->> 'cubPersonId' = :oldId", nativeQuery = true)
void updateCubPersonId(@Param("newId") String newId,@Param("oldId") String oldId);

这样打电话

String oldId = "12778269";
updateCubPersonId( "'\" 12778268l \"'",oldId);

【问题讨论】:

【参考方案1】:

psql 中,参数'cubPersonId' 自动转换为text[]。在 JDBC 中,情况并非如此,您需要明确说明,例如:

@Query(value = "UPDATE billing_log_criteria "
        + "SET value = jsonb_set(value, 'cubPersonId'::text[],  jsonb_set(value, 'cubPersonId'::text[], to_jsonb(:newId::text))) "
        + "where value ->> 'cubPersonId' = :oldId", nativeQuery = true)

【讨论】:

上述代码不起作用。 :newId 和 = :oldId 仍然是问题 您能否在问题中添加您遇到的错误?刚刚修复了函数jsonb_set的类型转换,但参数oldId应该已经是character varyingtext,两者是可比的。

以上是关于JPA 和 JSON 运算符本机更新查询的主要内容,如果未能解决你的问题,请参考以下文章

JPA 查询语言中的 IN 和 = 运算符

Spring JPA Repository - jsonObject 上的运算符 SIMPLE_PROPERTY 需要标量参数

如何使用 jpa 执行本机 memsql 查询 [重复]

jsonb字段上的Spring-Data-JPA本机查询

Spring Data JPA 方法或查询以使用 Postgres 列执行算术运算

JPA 连接运算符