Исключение гибернации при обнаружении оператора mysql:=

Когда я выполняю следующий код, возникает исключение:

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();
    }

В чем причина такого поведения?

2 ответа

Решение

Немного сложно понять, какой именно запрос вы выполняете, но если вам нужно использовать символ двоеточия в нативном запросе, в вашем случае в качестве оператора "назначить значение", вы должны избежать всех вхождений двоеточия с помощью \\ в вашей строке Ja va с запросом, так что это может быть как:

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, существует открытая проблема по этому поводу. Это означает, что вы не можете использовать двоеточия в собственных запросах Hibernate не для именованных параметров. Вы можете попытаться создать функцию и вызвать ее вместо вызова запроса.

Вы можете создать именованный запрос и затем использовать его в репозитории Spring jpa или hibernate. Эта ссылка помогла мне от подобной проблемы.

Другие вопросы по тегам