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 ответ

Решение

Ну, это не легко возможно. У вас есть два варианта:

  1. Объедините поля в базе данных и выполните поиск по ним. Не совсем уверен, как это сделать с помощью JPA/Hibernate. Это самый быстрый метод, но для этого вам понадобится сырой SQL.

  2. Выберите все поля имени из базы данных, объедините их и выполните сопоставление в Java.

У вас может быть третий вариант, когда вы можете разделить входные данные (на основе пробелов?) И искать в каждом поле все входные части, но это ставит вас во все виды проблем: что если ваш пользователь вводит "Джон Доу", но вы есть "Доу, Джон"? Что если кто-то ожидает найти человека, использующего ее второе имя? Что делать, если у кого-то нет фамилии?

Подводя итог: извлеките все поля имен из базы данных, объедините их и выполните поиск в списке строк с помощью String#contains(),

Другие вопросы по тегам