在HQL中,第二次替换命名参数失败

时间:2011-05-02 09:31:33

标签: java hibernate hql

我有这种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设置t.myCol = case时((t.myCol +:myColChange)&lt; 0)然后0 else(t .myCol +:myColChange)结束]

感谢您解决此问题的任何想法。谢谢!

4 个答案:

答案 0 :(得分:3)

怎么样

.... set t.myCol = max(0, t.myCol + :myColChange)

答案 1 :(得分:0)

解决方法是使用两个不同的名称/参数。

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

答案 2 :(得分:0)

你真的

吗?
setXXXXX("myColChange", myColChangeValue);
在执行它之前

在Query对象上?

我只是问,因为你没有发布你的代码。

答案 3 :(得分:0)

我也有这个问题。我目前的解决方法是不使用命名参数,而是使用位置。

对我来说这不是一个大问题,因为我将查询参数存储在我自己的对象列表中。

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

    }