我正在开发一种方法,该方法将查询中的标准研究和标准值开头的文本作为参数,但每次我测试它,所以我得到一个空列表,我需要一些请帮忙
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 :(得分: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次,你的应用程序就再也无法连接到数据库了。