我有这种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)结束]
感谢您解决此问题的任何想法。谢谢!
答案 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();
}