Реализация функциональности поиска весной и HQL - PullRequest
0 голосов
/ 28 августа 2018

Я использую поиск в моем весеннем загрузочном приложении. Поисковый термин - это поиск по имени, фамилии и электронной почте. В моей базе данных я храню имя в двух столбцах: имя и фамилия. Чего я хочу добиться, так это позволить пользователю ввести полное имя (имя + фамилия) и выполнить поиск в базе данных. Я попробовал это, но когда все параметры пусты, этот запрос возвращает мне пустое множество, и я ожидал, что он вернет всех пользователей.

   @Query("FROM Employee e WHERE "
            + "lower(concat(e.firstName,' ',e.lastName)) like lower('%'+':fullName'+'%') AND "
            + "lower(e.email) like lower('%'+':email'+'%')")
    public Page<Employee> search(@Param(value = "fullName") String fullName,
                                 @Param(value = "email") String email,
                                                         Pageable page);

Я не уверен, что смогу использовать concat вот так. Если это проблема, есть ли альтернатива?

Редактировать

Я попытался удалить знаки % из запроса, и это сработало. Кажется, мне просто нужно правильно их расположить, но я не знаю как.

Это сработало:

@Query("FROM Employee e WHERE "
            + "lower(concat(e.firstName,' ',e.lastName)) like lower(:fullName) AND "
            + "lower(e.email) like lower(:email)")
    public Page<Employee> search(@Param(value = "fullName") String fullName,
                                 @Param(value = "email") String email,
                                                         Pageable page);

Вопрос только в том, как использовать %.

1 Ответ

0 голосов
/ 28 августа 2018

Проблема, вероятно, в том, что HQL интерпретирует эту часть запроса способом, который не соответствует вашим потребностям:

lower(e.email) like lower('%'+':email'+'%')")

Из спецификации HQL я знаю, что знак "+" разрешен как арифметический оператор, но я не уверен, что он разрешен при любом другом использовании.

Очевидно, что ваше утверждение «что-то значит», поскольку Hibernate не сообщает о нем как о синтаксической ошибке, но я не знаю, что это значит, поскольку мы не в арифметическом контексте. Может быть, он объединяет строку, но не заменяет заполнитель? Было бы интересно, чтобы Hibernate активировал showSQL и зарегистрировал его, или увидел скомпилированную версию объекта запроса, чтобы проанализировать его, но сейчас у меня нет времени делать это.

В любом случае, для достижения того же результата предсказуемым образом, я предлагаю вам переписать

mail like concat('%', lower(:email), '%')

что я нахожу не двусмысленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...