Вторая замена именованного параметра завершается неудачно в HQL - PullRequest
1 голос
/ 02 мая 2011

У меня есть HQL-оператор такого рода:

update versioned MyTable t 
set t.myCol = case 
   when ((t.myCol + :myColChange) < 0) then 0 
   else (t.myCol + :myColChange) end

Я вижу, что это не работает из-за второго появления :myColChange. Выдается следующее исключение:

org.hibernate.QueryException: были установлены не все именованные параметры: [myColChange] [обновление версии MyTable t set t.myCol = case, когда ((t.myCol +: myColChange) <0), затем 0 else (t. myCol +: myColChange) end] </p>

Буду признателен за любые идеи по решению этой проблемы. Спасибо!

Ответы [ 4 ]

3 голосов
/ 02 мая 2011

Как насчет

.... set t.myCol = max(0, t.myCol + :myColChange)
0 голосов
/ 20 декабря 2011

У меня тоже есть эта проблема.Мой текущий обходной путь - НЕ использовать именованные параметры, а вместо этого использовать позиции.

Для меня это не большая проблема, потому что я сохраняю параметры запроса в своем собственном объекте в списке.

    public void apply( final CategoryFilter f )
    {
        final String jsonFilter = f.getFilter();
        final QueryParameters queryParams = QueryParameters.createFromJsonString( jsonFilter );

        final StringBuilder queryStringBuilder =
            new StringBuilder( "UPDATE Transaction t SET t.category = 'myCatergory' WHERE " );

        boolean isFirst = true;
        for ( final QueryParameter queryParam : queryParams.getQueryParams() )
        {
            if (!isFirst)
            {
                queryStringBuilder.append( " AND " );
            }
            else
            {
                isFirst = false;
            }
            queryStringBuilder.append( "t." );
            queryStringBuilder.append( queryParam.getField() );
            queryStringBuilder.append( " " );
            queryStringBuilder.append( queryParam.getOp() );
            queryStringBuilder.append( " ? " );
        }
        final Query q = getSession().createQuery( queryStringBuilder.toString() );

        int index = 0;
        for ( final QueryParameter queryParam : queryParams.getQueryParams() )
        {
            q.setParameter( index++, queryParam.getValue() );
        }
        q.executeUpdate();

    }
0 голосов
/ 02 мая 2011

Вы действительно

setXXXXX("myColChange", myColChangeValue);

на объекте Query перед его выполнением?

Я просто спрашиваю, потому что вы не опубликовали свой код.

0 голосов
/ 02 мая 2011

Обходной путь - использовать два разных имени / параметра.

update versioned MyTable t 
set t.myCol = case 
   when ((t.myCol + :myColChange1) < 0) then 0 
   else (t.myCol + :myColChange2) end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...