2013-07-19 105 views
0

我正在開發一種方法,作爲參數的標準研究中的查詢和標準的價值開始的文本,但每次我測試它,所以我得到一個空列表,我需要一些幫助問題像在休眠hql

public ArrayList<Article> getArticleByCritere(String critere, String txt){ 
       ArrayList list = new ArrayList<Article>(); 
       list=null; 
       String cr; 
     try { 
      this.session = HibernateUtil.getSessionFactory().openSession(); 
      org.hibernate.Transaction tx = session.beginTransaction(); 

     if(critere.equals("Référence")) 
      cr="refa"; 
     else if(critere.equals("Désignation")) 
      cr="designation"; 
     else if(critere.equals("Famille")) 
      cr="famille"; 
     else if(critere.equals("Code")) 
      cr="codeArticle"; 
     else 
      cr = "sousFamille"; 
     String query = "from Article where :critere like :debut"; 
     list = (ArrayList<Article>) session.createQuery(query).setString("critere", cr).setString("debut", txt + "%").list(); 
       tx.commit(); 
      System.out.println("ok"); 
      session.close(); 
     } catch (Exception e) { 
      System.out.println(" getArticleByFamDesign a échoué" + e); 
     } 
     return list; 
      } 
could any one help me to find what's the problem here !! 

回答

0

您可以隨時傳遞值作爲查詢參數。您不能傳遞查詢的rando部分,如列名稱。

因此,代碼應該是:

String query = "from Article where " + cr + " like :debut"; 
list = (List<Article>) session.createQuery(query) 
           .setString("debut", txt + "%") 
           .list(); 

此外,注意以下幾點。

Query.list()返回一個List,並且文檔不保證該列表是一個ArrayList。你不應該把結果轉換成ArrayList。事實上,你根本沒有理由這樣做。你爲什麼會關心列表的具體實現。重要的是它是一個List。你的方法也應該返回List<Article>,而不是ArrayList<Article>

的這兩行代碼使絕對沒有任何意義:

所有的
ArrayList list = new ArrayList<Article>(); 
list = null; 

首先,你並不需要在這一點上申報清單。只有在需要時才申報。 其次,你不應該使用原始類型。始終指定集合的​​通用類型。 三,創建一個新的ArrayList對象有什麼意義,只需將list重新初始化爲null,然後立即將它扔到垃圾箱中?

最後,你的異常處理是可怕的。只有在能夠做出有意義的事情來解決問題時才吞下例外。返回null而不是實際結果比讓異常傳播更糟糕。現在,你不知道爲什麼你會得到空值,因爲你甚至沒有打印出這個異常,所以你甚至不能診斷出問題所在。

處理異常事務和會話的方式在the hibernate documentation中描述。會話應該在finally塊中關閉,以確保它已關閉。不關閉它會使數據庫連接永遠打開。做50次,你的應用程序就不能再連接到數據庫了。