【问题标题】:Could not locate named parameter even though parameter exists without surrounding quotes即使参数存在而没有周围的引号,也无法找到命名参数
【发布时间】:2021-10-09 09:24:42
【问题描述】:

当我在我的 springboot 项目中运行以下查询时

select * from activity.activity where data->'userinfo' @> '[{"name": :username}]'::jsonb

我收到此错误“无法找到命名参数 [用户名],需要 [] 之一”。

表格有一个数据列,值为{"userinfo": [{"name": "john"},{"lastname":"cena"}]}

可能是什么问题?

PS:我正在使用实体管理器执行查询以创建本机查询,然后调用 query.getResultList()。

代码:

StringBuffer q = new StringBuffer("select * from activity.activity where data->'userinfo' @> '[{\"name\":").append(" :username").append("}]'::jsonb");
Query query = null;
query = em.createNativeQuery(q.toString(), Activity.class);
query.setParameter("username", getActivityDataRequest.getUserName());
return query.getResultList();

【问题讨论】:

  • 你如何执行这个查询?
  • @SimonMartinelli 我正在使用实体管理器执行查询以创建本机查询,然后调用 query.getResultList()。我刚刚也用此信息更新了问题
  • 能否请您添加与查询相关的完整代码?目前还不清楚绑定过程中用户名是如何传递的。
  • 没有引号?我可以在这里看到它们:'[{"name": :username}]'.
  • @SalmanA 命名参数不在引号内,这意味着它不像'[{"name": ":username"}]'。注意 :username 周围的引号。我看到了人们遇到的其他 stackoverflow 问题,显然这肯定行不通。

标签: java sql postgresql spring-boot hibernate


【解决方案1】:

这是一个字符串文字。它不能包含参数。不过,您确实有一个 :jsonb 参数。您应该使用 ANSI SQL 强制转换来避免这种情况。

相反,您应该将查询更改为

String sql = "select * from activity.activity where data->'userinfo' @> CAST(:uname as jsonb)"
// next line is psudocode
String value = JsonBuilder.newArray( JsonBuilder.newObject("name", username) ).toString();
// real code
return em.createNativeQuery(sql, ResultClass.class)
     .setParameter("uname", value)
     .getResultList();

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多