Подстановочный знак HQL с пользовательским типом Hibernate

Я создал Hibernate UserType для своего класса PhoneNumber, поддерживаемого одним столбцом VARCHAR в db. Как правило, это работает нормально. Но теперь мне нужно что-то вроде этого

String hql = "FROM Call c WHERE c.calledNumber LIKE :param";
...
query.setParameter("param", "%385%");

который заканчивается

java.lang.IllegalArgumentException: Parameter value [%385%] did not match expected type [PhoneNumber]

Как я могу это сделать?


person Ondřej Míchal    schedule 18.03.2015    source источник


Ответы (3)


c.calledNumber — это объект PhoneNumber, и вы пытаетесь сравнить его со строкой '%385%'. То, что происходит, похоже на сравнение таблицы со столбцом.

То, что вы должны сделать, это написать следующее:

String QUERY = "FROM Call c join c.calledNumber pn WHERE pn.number LIKE :myNumber";

где поле pn.number представляет собой строку Java.

person dnlrmrez    schedule 08.06.2017

String hql = "FROM Call c WHERE c.calledNumber LIKE concat('%', :param, '%')";
...
query.setParameter("param", "385");

сделает работу.

person ppiatkowski    schedule 19.09.2019

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

Вам нужно добавить %s к значениям параметров с конкатенацией строк.

Вы можете попробовать:

String QUERY = "FROM Call c WHERE c.calledNumber LIKE :myNumber";
(List<Call>)session.createQuery(QUERY)
    .setString("myNumber", "%" + "385" + "%").list();
person Prateek T    schedule 18.03.2015
comment
Извините, моя ошибка при упрощении примера. Я обновил вопрос, теперь он должен быть правильным. - person Ondřej Míchal; 18.03.2015