2011-04-28 3 views
0

У меня есть DetachedCriteria, который я использую для поиска таблицы на основе поля имени. Я хочу сделать запрос нечувствительным к регистру, и мне интересно, есть ли способ сделать это без использования HQL. Что-то вроде:Использование Hibernate DetachedCriteria для вызова агрегатных функций

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) { 
     criteria.add(Restrictions.like("fullName", "%" + searchCriteria.toLowerCase() + "%")); 
     criteria.addOrder(Order.asc("fullName")); 
} 

Но я хочу, чтобы убедиться, что он будет игнорировать тот случай, когда он делает поиск (он должен искать как в верхнем и нижнем регистре), поэтому SQL он генерирует должен выглядеть примерно так :

SELECT * FROM Student WHERE ? LIKE toLower(FULL_NAME); 
+0

Если у вас есть много строк в этой таблице, движок должен будет выполнять сканирование таблицы с помощью 'toLower (FULL_NAME)', чего вы, возможно, и не захотите. Один из вариантов - сохранить его как все в нижнем регистре или добавить другой столбец, который используется только для поиска, в котором вы храните его все в нижнем регистре. – Augusto

ответ

0

Что вы используете? MySQL LIKE не учитывает регистр для столбцов CHAR, VARCHAR и TEXT (я считаю, что это верно и для SQL Server).

http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html

Если вы используете PostgreSQL, вы хотите использовать оператор ILIKE, так что вы хотите использовать Restrictions.ilike ("FULLNAME", имя).

0

Я вижу два варианта,

Вариант 1:

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) { 
      criteria.add(Restrictions.like("toLower(fullName)", "%" + searchCriteria.toLowerCase() + "%")); 
      criteria.addOrder(Order.asc("fullName")); 
    } 

Вариант 2:

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) { 
       criteria.add(Restrictions.sqlRestriction("toLower({alias}.fullName) LIKE '%" + searchCriteria.toLowerCase() + "%'")); 
       criteria.addOrder(Order.asc("fullName")); 
     } 

Я не очень оптимистично Вариант 1. Вариант 2 должен работать наверняка. {alias} является заполнителем, позволяющим Hibernate знать, что ему нужно добавить соответствующий псевдоним для таблицы при создании SQL. Больше информации http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Restrictions.html#sqlRestriction%28java.lang.String%29

Смежные вопросы