2013-07-19 3 views
0

Я разрабатываю метод, который принимает в качестве параметра критериальное исследование в Query и текст начала значения критерия, но каждый раз я проверяю его, поэтому я получаю пустой список, мне нужна помощь.Проблема с подобным в hibernate 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() возвращает список, и документация не гарантирует, что список является ArrayList. Вы не должны передавать результат в ArrayList. И на самом деле у вас нет причин делать это. Почему вы заботитесь о конкретной реализации списка. Все, что имеет значение, это то, что это список. Ваш methd также должен вернуть List<Article>, а не ArrayList<Article>.

Эти две строки кода не делают абсолютно никакого смысла:

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

Прежде всего, вам не нужно объявить список в этой точке. Только объявляйте его, когда вам это нужно. Во-вторых, вы не должны использовать необработанные типы. Всегда указывайте общий тип коллекции. В-третьих, в чем смысл создания нового объекта ArrayList, только для того, чтобы выбросить его в мусорный ящик сразу после повторной инициализации list до нулевого?

И, наконец, ваша обработка исключений ужасна. Используйте только проглатывание исключений, когда вы можете сделать что-то значимое для решения проблемы. Возвращение null, а не фактический результат намного хуже, чем распространение исключения. Теперь вы не знаете, почему вы получаете нуль, и поскольку вы даже не распечатали исключение, вы даже не можете диагностировать, что может быть проблемой.

Способ обработки исключений, транзакций и сеансов описан в the hibernate documentation. Сеанс должен быть закрыт в блоке finally, чтобы быть абсолютно уверенным, что он закрыт. Не закрывая его, вы оставите соединение с базой данных открытым навсегда. Сделайте это 50 раз, и ваше приложение больше не сможет подключаться к базе данных.