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 运算符本机更新查询的主要内容,如果未能解决你的问题,请参考以下文章