即使参数存在而没有周围的引号,也无法找到命名参数
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,如何在命名查询中转义单引号?