【问题标题】:JPA and JSON operator native update queryJPA 和 JSON 运算符本机更新查询
【发布时间】: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);

【问题讨论】:

    标签: json postgresql spring-boot jpa jsonb


    【解决方案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,两者是可比的。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2016-11-02
    • 2012-10-09
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多