即使参数存在而没有周围的引号,也无法找到命名参数

Posted

技术标签:

【中文标题】即使参数存在而没有周围的引号,也无法找到命名参数【英文标题】: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 周围的引号。我看到了人们遇到的其他 *** 问题,显然这肯定行不通。 【参考方案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();

【讨论】:

以上是关于即使参数存在而没有周围的引号,也无法找到命名参数的主要内容,如果未能解决你的问题,请参考以下文章

NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?

Hibernate中带有命名查询的可选参数?

组内的 Laravel 组不起作用,它没有看到命名空间参数

Python Pandas 合并(和连接)是不是无法通过后缀参数重命名列?

Resharper - 在进行代码清理时保留命名参数

防止 MySQL-Python 在数据库名称参数周围插入引号