与hibernate hql中的问题一样

时间:2013-07-19 12:59:25

标签: hibernate netbeans 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 !!

1 个答案:

答案 0 :(得分: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<Article>,而不是ArrayList<Article>

这两行代码完全没有意义:

ArrayList list = new ArrayList<Article>();
list = null;

首先,您不需要在此时声明列表。只在需要时声明它。 其次,你不应该使用原始类型。始终指定集合的​​泛型类型。 第三,创建一个新的ArrayList对象有什么意义,只是在将list重新初始化为null之后立即将它扔到垃圾箱中?

最后,您的异常处理非常糟糕。只有当你能做一些有意义的事情来解决问题时,才会吞下异常。返回null而不是实际结果比让异常传播要糟糕得多。现在你不知道为什么你得到null,并且由于你甚至没有打印异常,你甚至无法诊断问题可能是什么。

the hibernate documentation中描述了处理异常,事务和会话的方法。会话应该在finally块中关闭,以确保它已关闭。不关闭它将使数据库连接永远打开。这样做了50次,你的应用程序就再也无法连接到数据库了。