2013-07-19 106 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次,你的应用程序就不能再连接到数据库了。