【问题标题】:Second replacement of a named parameter fails in HQLHQL 中命名参数的第二次替换失败
【发布时间】:2011-05-02 09:31:32
【问题描述】:

我有这样的 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] [ update versioned MyTable t set t.myCol = case when ((t.myCol + :myColChange)

不胜感激任何解决此问题的想法。谢谢!

【问题讨论】:

  • 发布创建查询和设置参数值的代码怎么样? ;)

标签: java hibernate hql


【解决方案1】:

怎么样

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

【讨论】:

  • 谢谢,这是个好主意。但它相当设置 t.m​​yCol = best(0, t.myCol + :myColChange) 但是,这也会引发相同的异常。所以问题不可能是由于参数的第二次出现。知道为什么会这样吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你真的吗

    setXXXXX("myColChange", myColChangeValue);
    

    在 Query 对象上执行之前?

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

    【讨论】:

    • 是的,我做到了。我可以在调试时看到该值。我没有发布代码,因为我们正在调用我们公司特定的架构代码来实现它,在这里发布它是没有意义的。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2013-12-17
      • 2020-10-02
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多