Java HQL中命名参数的第二次替换失败
我有这样一个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)
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),但是,这也引发了相同的异常。因此,问题不可能是由于参数的第二次出现。知道为什么会这样吗?是的,我知道。我可以在调试时看到值。我不会发布代码,因为我们正在调用我们公司特定的体系结构代码来实现它,在这里发布它是没有意义的。