Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HQL中命名参数的第二次替换失败_Java_Hibernate_Hql - Fatal编程技术网

Java HQL中命名参数的第二次替换失败

Java HQL中命名参数的第二次替换失败,java,hibernate,hql,Java,Hibernate,Hql,我有这样一个HQL语句: update versioned MyTable t set t.myCol = case when ((t.myCol + :myColChange) < 0) then 0 else (t.myCol + :myColChange) end 更新版本化的MyT表 设置t.myCol=case 当((t.myCol+:myColChange)

我有这样一个HQL语句:

update versioned MyTable t 
set t.myCol = case 
   when ((t.myCol + :myColChange) < 0) then 0 
   else (t.myCol + :myColChange) end
更新版本化的MyT表
设置t.myCol=case
当((t.myCol+:myColChange)<0时,则为0
else(t.myCol+:myColChange)结束
我发现由于第二次出现了
:myColChange
,所以这不起作用。将引发以下异常:

org.hibernate.QueryException:未设置所有命名参数:[myColChange][update versioned MyTable t set t.myCol=case当((t.myCol+:myColChange)<0)然后设置0其他(t.myCol+:myColChange)end]

如果您有任何解决此问题的想法,我们将不胜感激。谢谢

怎么样

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

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

update versioned MyTable t 
set t.myCol = case 
   when ((t.myCol + :myColChange1) < 0) then 0 
   else (t.myCol + :myColChange2) end
更新版本化的MyT表
设置t.myCol=case
当((t.myCol+:myColChange1)<0时,则为0
else(t.myCol+:myColChange2)结束
你真的这么做了吗

setXXXXX("myColChange", myColChangeValue);
在执行查询对象之前,是否在该对象上执行


我这么问是因为你没有发布代码。

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

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

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

    }

发布创建查询和设置参数值的代码怎么样?;)谢谢,这是个好主意。但是它设置了t.myCol=magest(0,t.myCol+:myColChange),但是,这也引发了相同的异常。因此,问题不可能是由于参数的第二次出现。知道为什么会这样吗?是的,我知道。我可以在调试时看到值。我不会发布代码,因为我们正在调用我们公司特定的体系结构代码来实现它,在这里发布它是没有意义的。