2011-05-02 16 views
1

我有這種的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.myCol =情況下,當((t.myCol +:myColChange) < 0)then 0 else(t.myCol +:myColChange)end]

希望能解決這個問題的任何想法。謝謝!

+0

如何發佈創建查詢的代碼並設置參數值? ;) – AndrewBourgeois 2011-05-02 09:44:32

回答

3

如何

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

謝謝,這是一個好主意。但它的 設置t.myCol =最大(0,t.myCol +:myColChange) 但是,這也引發了相同的異常。所以問題可能不是由於第二次出現的參數。任何想法爲什麼發生這種情況? – pall 2011-05-02 12:24:37

0

一個解決辦法是使用兩個不同的名字/參數。

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

你真的

setXXXXX("myColChange", myColChangeValue); 
查詢對象

執行前?

我只是問,因爲你沒有發佈你的代碼。

+0

是的,我做到了。我可以在調試時看到它的價值。我不會發布代碼,因爲我們正在調用我們公司特定的架構代碼來實現它,將它發佈在這裏是沒有意義的。 – pall 2011-05-02 14:00:47

0

我也有這個問題。我目前的解決方法是不使用命名參數,而是使用位置。

對我來說這不是一個大問題,因爲我將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(); 

    }