【问题标题】:How can i escape the ::JSONB in postgres query?如何在 postgres 查询中转义 ::JSONB?
【发布时间】:2018-02-13 07:55:40
【问题描述】:

执行查询时出现以下异常

org.hibernate.QueryException:并非所有命名参数都已设置:
[:jsonb]

这是我的查询:

SELECT * FROM content c,resource r,organization_resource_relationship 
org,json_array_elements(c.attributes->'data') obj
WHERE c.resource_id=r.resource_id and r.account_id='633' and    
r.resource_id = org.resource_id and r.delete_status = false 
and ((obj->>'userId' in(select cast(resource_id as text) from resource 
 where resource_id=3181)  or  obj->>'signatureByCmisUsers'
 like '%3181%' or  obj->>'visibleToCmisUsers' like '%3181%' or  
 obj->>'editableByCmisUsers' like '%3181%' or  
 obj->>'obtainSignatureByCmisUsers' 
 like '%3181%' or  obj->>'documentVisibleToCmisUsers' like '%3181%' ) and 
  (obj->>'signatureStatus' like 'Pending'  or obj->>'signatureStatus'
  like 'PENDING'  or obj->>'signatureStatus' like 'SIGNED' or 
  obj->>'signatureStatus' like 'Signed') and   
 (obj->>'isDeleted'='false') 
   and ((obj->>'parentFolderId'='nil' or obj->>'parentFolderId' in 
     (select cast(resource_id as text) from
    resource re where re.delete_status=false))) and 
    ((obj->>'userType'='owner' or obj->>'userType'='receiver'))) 
    and ((((obj->>'visibleToRoles' like '%215%') and  
    ((obj->>'visibleToRoles') ::jsonb) ? 
    (select cast(resource_to_id as text) from resource_relationship where 
     resource_from_id=3181 and resource_to_id=215))))  
     and json_typeof(c.attributes->'data')='array' ORDER BY r.updated_on 
      DESC

如何解决这个问题?我需要使用::jsonb。但它会引发异常。

【问题讨论】:

    标签: java json postgresql hibernate


    【解决方案1】:

    请改用位置参数?1?2 等。当遇到: 时,Hibernate 会感到困惑,并且没有“转义”,因为它是合法的 Postgres 简写形式。

    您也可以将其替换为CAST(obj->>'visibleToRoles' AS jsonb),但如果您更喜欢简写语法,则不能使用命名参数。

    实际上,你为什么还要投射它?为什么不用-> 而不是->> 获得它?

    顺便说一句,很好的查询。 (这是讽刺,看起来很糟糕而且效率低下)。

    【讨论】:

    • 谢谢 Kayaman,您好,该错误已修复,但现在显示 Expected positional parameter count: 1, actual parameters: [] 。我用过了 ?在上一个查询中,您可以在 jsonb 之后看到。但不是为了位置参数。我怎样才能解决这个问题 ?请帮忙
    • 嘿,那我猜你应该改用CAST,或者如果你打算将其解释为JSON,则应该使用->
    • cast(obj->'visibleToRoles' as jsonb) ?" + " (select cast(resource_to_id as text) from resource_relationship where resource_from_id=3181 and resource_to_id=215)))) 现在查询正确吗?但这也说明了那个错误。你能把这些部分修改发给我吗?
    • 基于stackoverflow.com/questions/14779896/…,您似乎可以使用?? 来解决这个问题。
    • 您好,我试过了。但是预期的位置参数计数:2,实际参数:[]错误显示。任何其他解决方案。以某种方式逃避那个角色
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多