При использовании Hibernate для Java появляется список параметров привязки ненормального поведения в HQLJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 При использовании Hibernate для Java появляется список параметров привязки ненормального поведения в HQL

Сообщение Anonymous »

Я использую Hibernate v3.6.4 в своем проекте Java. У меня возникают проблемы при попытке использовать список параметров для именованного параметра в моем запросе HQL.
По сути, я хочу получить все записи, соответствующие одному из идентификаторов, упомянутых в IN. .
Я пробовал использовать и HQL, и критерии, но получил тот же результат.
Мой запрос HQL:

Код: Выделить всё

Set reportIds = new HashSet();
reportIds.add("1");
reportIds.add("2");

String whereClause = "from Report where id IN (:reportIds) ";
Query query = session.createQuery(whereClause);
query.setParameterList("reportIds", reportIds);
Вывод = пустой список. Хотя я проверил ручными sql-запросами в терминале, что такие записи действительно есть.
Включил логирование и вот что вижу:
Спящий режим:

Код: Выделить всё

    /*
from
Report
where
id IN (
:ids
) */ select
mediavalue0_.id as id31_,
...

from
report mediavalue0_
where
mediavalue0_.id in (
?
)

Код: Выделить всё

HibernateLog --> 13:22:36 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - 1,2
Это очень ненормально, потому что, если вы заметили последний оператор связывания, он учитывает toString() из Set, т. е. "1,2"< /code> вместо «1», а затем «2»!
Я возился с этим, поэтому по прихоти решил создать напрямую экземпляр Set внутри setParameterList() вызов метода сам по себе. Вот так,

Код: Выделить всё

query.setParameterList("reportIds", Sets.newHashSet("1","2"));
И это сработало! Кстати, Sets.newHashSet() — это конструкция, предоставленная библиотекой Google Guava. Я использую ту же библиотеку для создания исходного набора reportIds. Таким образом, никакого противоречия здесь нет.
Этот запрос преобразуется в следующий TRACE:

Код: Выделить всё

from
Report
where
id IN (
:ids
) */ select
mediavalue0_.id as id31_,
...
from
report mediavalue0_
where
mediavalue0_.id in (
? , ?
)

Код: Выделить всё

HibernateLog --> 13:28:57 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - 1
HibernateLog --> 13:28:57 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - 2
Обратите внимание на отдельные привязки для VARCHAR.
Я совершенно сбит с толку этим странным поведением. Возможно, некоторые из вас, ребята, смогут указать, что я делаю неправильно.
К вашему сведению, конструкция критериев, которую я использовал (и которая привела к тому же результату), выглядит следующим образом:

Код: Выделить всё

Criteria criteria = session.createCriteria(Report.class);
criteria.add(Restrictions.in("id", reportIds));
P.S. Я также использовал именованный SQL-запрос с тем же результатом:

Код: Выделить всё


SELECT mvr.* from report mvr
WHERE mvr.id IN :ids

ОБНОВЛЕНИЕ:
Я обнаружил проблему. Как-то неловко. Код на стороне клиента отправлял элемент Set из 1, который представлял собой объединенную строку идентификаторов отчетов. Ааа!


Подробнее здесь: https://stackoverflow.com/questions/143 ... terlist-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: ожидаемый путь для присоединени
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Запрос Hibernate: невозможно получить и отобразить результаты с помощью HQL
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Проект с использованием Yii2, Jersey для API и Hibernate для HQL [закрыто]
    Anonymous » » в форуме Php
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: USE
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: USE
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»