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 varying
或text
,两者是可比的。以上是关于JPA 和 JSON 运算符本机更新查询的主要内容,如果未能解决你的问题,请参考以下文章
Spring JPA Repository - jsonObject 上的运算符 SIMPLE_PROPERTY 需要标量参数