2012-09-27 55 views
5

我得到的錯誤是並非所有的命名參數都設置爲。以下是我的代碼。並非所有命名參數都已經在createSQLQuery中設置了hibernate

我的類SqlQuery這是在mysql的提示符下運行良好,你可以參考在提問模式SQL Query

SELECT t.* 
FROM (
    SELECT @lim := 2, 
      @cg := '' 
    ) vars, 
    (select * from Table1 order by product,amount, make) t 
WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 
    AND (@r := @r - 1) >= 0 
    AND (@cg := product) IS NOT NULL 
ORDER BY 
    product,amount, make 

我的Java代碼

try { 
      context.dbl.startTransaction(); 
      Session session = context.dbl.getSession(); 

      //String sqlQuery = "from com.infibeam.inventoryservice.dbObjects.PopularBrandDO"; 
      String sqlQuery = "SELECT t.* "; 
      sqlQuery=sqlQuery + "FROM ("; 
      sqlQuery=sqlQuery + "SELECT @lim := 2,"; 
      sqlQuery=sqlQuery + "@cg := ''"; 
      sqlQuery=sqlQuery + ") vars, "; 
      sqlQuery=sqlQuery + "(select * from Table1 order by product,amount, make) t"; 
      sqlQuery=sqlQuery + " WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0"; 
      sqlQuery=sqlQuery + " AND (@r := @r - 1) >= 0 "; 
      sqlQuery=sqlQuery + " AND (@cg := product) IS NOT NULL "; 
      sqlQuery=sqlQuery + " ORDER BY product,amount, make"; 
      //Query query = session.createQuery(sqlQuery); 
      SQLQuery query = session.createSQLQuery(sqlQuery); 
      listItems = query.list(); 


      }catch(RuntimeException e) { 
       e.printStackTrace(); 
      } 

下面是我得到

org.hibernate.QueryException: Not all named parameters have been set: [] [SELECT t.* FROM (SELECT @lim := 2,@cg := '') vars, (select * from Table1 order by product,amount, make) t WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 AND (@r := @r - 1) >= 0 AND (@cg := product) IS NOT NULL ORDER BY product,amount, make] 
    at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:291) 
    at org.hibernate.impl.SQLQueryImpl.verifyParameters(SQLQueryImpl.java:199) 
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:143) 
    at com.infibeam.weaverbird.helper.PopularBrandFacetHelper.bootstrap(PopularBrandFacetHelper.java:48) 
異常

在此先感謝...

回答

13

問題是:=的分配問題,順便說一句,沒有標準的SQL。

在SQL之後的:總是一個參數,如where value = :param和:param已經被設置爲參數。現在hibernate正在掃描select並找到沒有設置參數的冒號。

解決方案:使用休眠標準重新設計您的選擇。

您可以使用兩個不同的HQL查詢。

首先:選擇所有產品:select distinct product from Table1

第二:爲你做from Table1 where product = :prod每個產品:PROD設置與實際產品的參數,並與setMaxResults(2)你可以限制爲行數你需要。

現在它有很多選擇,而不是單一的選擇,但是它們可能比單個查詢更快(單個查詢很複雜並且在數據庫中存在無效的搜索策略風險)。還有一個很大的優勢,現在它純粹是HQL,所以你的程序可以移植到不同的數據庫中。

相關問題