Hibernate, сравнивающий значение (или части) с 2 столбцами
У меня есть 2 столбца имя: имя, фамилия У меня есть значение поиска под названием поиск. Я хочу иметь возможность искать по полному имени, например: Джон Доу. (с пробелом). До сих пор я работал только с именем или фамилией, печатая Джон или Доу.
Это то, что я пытался за полное имя:
Criterion fullname = Restrictions.and(Restrictions.like("name", search).ignoreCase(),
Restrictions.like("surname", search).ignoreCase());
Полная часть:
Private List<Users> getSearch(String search) {
List<Users> users = new ArrayList<Users>();
Session dbSession = HibernateUtil.getSessionFactory().getCurrentSession();
try {
Transaction tx = dbSession.beginTransaction();
Criteria cr = dbSession.createCriteria(Users.class);
Criterion name = Restrictions.or(Restrictions.like("name", search).ignoreCase(),
Restrictions.like("surname", search).ignoreCase());
Criterion fullname = Restrictions.and(Restrictions.like("name", search).ignoreCase(),
Restrictions.like("surname", search).ignoreCase());
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(name);
disjunction.add(fullname);
cr.add(disjunction);
users = (List<Users>) cr.list();
tx.commit();
} catch (HibernateException he) {
}
return users;
}
1 ответ
Ну, это не легко возможно. У вас есть два варианта:
Объедините поля в базе данных и выполните поиск по ним. Не совсем уверен, как это сделать с помощью JPA/Hibernate. Это самый быстрый метод, но для этого вам понадобится сырой SQL.
Выберите все поля имени из базы данных, объедините их и выполните сопоставление в Java.
У вас может быть третий вариант, когда вы можете разделить входные данные (на основе пробелов?) И искать в каждом поле все входные части, но это ставит вас во все виды проблем: что если ваш пользователь вводит "Джон Доу", но вы есть "Доу, Джон"? Что если кто-то ожидает найти человека, использующего ее второе имя? Что делать, если у кого-то нет фамилии?
Подводя итог: извлеките все поля имен из базы данных, объедините их и выполните поиск в списке строк с помощью String#contains()
,