2016-09-07 2 views
0

Я хочу реализовать фильтрацию данных DataTable на стороне сервера. Ниже приведен метод обслуживания для извлечения списка:Невозможно использовать выражение в where где

@Override 
    @Transactional 
    public List<User> list(int start, int length, String search, int triIdx, String ordreTri) { 

     String hql = "from User "; 

     if (!search.equals("") && search != null) { 

      hql = hql.concat(" where "); 

      if (NumberUtils.isNumber(search)) 
       hql = hql.concat(" salary "); 
      else 
       hql = hql.concat(" lower(username) "); 

      hql = hql.concat(" like lower('%:critere%') "); 

     } 

     if (ordreTri.equals("asc")) { 
      switch (triIdx) { 
       case 0: 
        hql = hql.concat(" order by username "); 
        break; 
       case 1: 
        hql = hql.concat(" order by email "); 
        break; 
       case 2: 
        hql = hql.concat(" order by salary "); 
        break; 
       default: 
        hql = hql.concat(" order by username "); 
        break; 
      } 
     } else { 
      switch (triIdx) { 
      case 0: 
       hql = hql.concat(" order by username desc"); 
       break; 
      case 1: 
       hql = hql.concat(" order by email desc"); 
       break; 
      case 2: 
       hql = hql.concat(" order by salary desc"); 
       break; 
      default: 
       hql = hql.concat(" order by username desc"); 
       break; 
      } 
     } 

     Query query = sessionFactory.getCurrentSession().createQuery(hql); 
     query = query.setParameter("critere",search); 
     query = query.setFirstResult(start); 
     query = query.setMaxResults(length); 

     @SuppressWarnings("unchecked") 
     List<User> listUser = (List<User>) query.list(); 
     return listUser; 
    } 

Во время выполнения я получаю сообщение об ошибке dataTable о данных. Так что же не так в моем коде?

+0

Там нет critera. Ваша строка экранирована, поэтому запрос выполняется как есть и не содержит критериев с именем «critere». Удалите escaping и prefix/суффикс ваших критериев с '%' перед его настройкой. –

ответ

0
hql.concat(" like lower('%:critere%') ") 

должен быть rewrittent к:

hql.concat(" like :critere ") 
query = query.setParameter("critere", "%" + search.toLowerCase(Locale. ....) + "%"); 
Смежные вопросы