当我执行以下代码时,会发生异常:
Exception: org.springframework.orm.hibernate3.HibernateQueryException:
Not all named parameters have been set
这是我的代码:
queryString = SET @quot=0,@latest=0,@comp='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,quote-@quot as `change`, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
list = getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)throws HibernateException,SQLException {
SQLQuery query = session.createSQLQuery(queryString);
query.setParameterList("list", custIds);
return query.list();
}
这种行为的原因是什么?
答案 0 :(得分:2)
它有点难以理解,您正在执行的查询究竟是什么,但是如果您需要在本机查询中使用冒号字符,在您的情况下为&#34;分配值&#34;运算符,您应该使用查询中的{1}}中的\\
转义所有冒号,这可能是这样的:
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp\\:=A.company as company from (
select time,company,quote-@quot as `change`, @quot\\:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
更新:似乎,在Hibernate本机查询中还不可能逃避冒号,关于它有一个open issue。这意味着,您无法在Hibernate本机查询中使用冒号而不能使用命名参数。您可以尝试创建一个函数并调用它而不是调用查询。
答案 1 :(得分:0)
您可以创建一个命名查询,然后在spring jpa存储库或hibernate中使用它。这link帮我解决了类似的问题。