HQL-запрос с LIKE, имеющим проблемы - PullRequest
26 голосов
/ 24 марта 2011

Я работаю над поисковым запросом, используя HQL, и все работает, находя, пока не дойду до предложения LIKE. Независимо от того, что я делаю, похоже, что предложение LIKE не выполняется должным образом. Вот мой запрос.

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
     AND p.personId in (SELECT pn.personId FROM PersonName pn WHERE pn.personNameType = 'FIRST' AND pn.name LIKE '%:firstName%')";

(List<Person>)session.createQuery(QUERY).setString("createUser", createUser).setString("firstName", firstName).list();

Ответы [ 2 ]

55 голосов
/ 24 марта 2011

Параметры внутри строковых литералов не разрешаются.

Вам необходимо добавить % s к значениям параметров с конкатенацией строк - либо на стороне программы

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
     AND p.personId in " +
     "(SELECT pn.personId FROM PersonName pn " + 
     "WHERE pn.personNameType = 'FIRST' " + 
     "AND pn.name LIKE :firstName)";

(List<Person>)session.createQuery(QUERY)
    .setString("createUser", createUser)
    .setString("firstName", "%" + firstName + "%").list();

, либо в базе данныхсторона:

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
     AND p.personId in " +
     "(SELECT pn.personId FROM PersonName pn " + 
     "WHERE pn.personNameType = 'FIRST' " + 
     "AND pn.name LIKE CONCAT('%', :firstName, '%'))";

(List<Person>)session.createQuery(QUERY)
    .setString("createUser", createUser)
    .setString("firstName", firstName).list();
0 голосов
/ 15 апреля 2019

мы можем использовать несколько concat для решения этой проблемы.

SELECT pn.personId FROM PersonName pn WHERE pn.personNameType = 'FIRST' AND pn.name LIKE concat(concat('%", firstName), '%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...