Использование предложения IN в собственном SQL-запросе в Hibernate 3.2.2 - PullRequest
12 голосов
/ 04 апреля 2011

По аналогии с вопросом, найденным здесь: Использование предложения IN в собственном SQL-запросе ;Я пытаюсь использовать предложение IN() посредством собственного запроса SQL в Hibernate.Хотя автор в другом вопросе смог использовать JPA, я нет.Кроме того, я застрял с версией 3.2.2.

Кажется, что Hibernate изначально не поддерживает IN(), потому что пытается преобразовать мой список (массив длинных примитивов) идентификаторов в двоичную форму при применении параметров запроса: query.setParameter("publisherGroups", [1243536264532,1243536264533,1243536264535]);

Из Hibernate:

SELECT sum(C2CReportedConversion) as c2CConversion, sum(C2CReportedRevenue) as c2CRevenue, sum(I2CReportedConversion) as i2CConversion, sum(I2CReportedRevenue) as i2CRevenue, sum(Clicks) as clicks, sum(Impressions) as impressions, sum(Requests) as requests, sum(Views) as views, coalesce(Name, DisplayName) FROM UiTemplateReportingCache JOIN AdUnit USING (AdUnitId) WHERE PublisherId = ? AND PublisherGroupId IN ( ? ) AND Date >= ? AND Date <= ? GROUP BY coalesce(Name, DisplayName)

Из журналов MySQL:

SELECT sum(C2CReportedConversion) as c2CConversion, sum(C2CReportedRevenue) as c2CRevenue, sum(I2CReportedConversion) as i2CConversion, sum(I2CReportedRevenue) as i2CRevenue, sum(Clicks) as clicks, sum(Impressions) as impressions, sum(Requests) as requests, sum(Views) as views, coalesce(Name, DisplayName) FROM UiTemplateReportingCache JOIN AdUnit USING (AdUnitId) WHERE PublisherId = 1239660230591 AND PublisherGroupId IN (_binary'��\0ur\0[Jx ��u�\0\0xp\0\0\0 \0\0!���T\0\0!���U\0\0!���W\0\0!���m\0\0!���n\0\0!���t\0\0!���{\0\0!���|\0\0!���}\0\0!���~\0\0#��\0\0$|��S') AND Date >= '2011-03-17 00:00:00' AND Date <= '2011-03-18 23:59:59' GROUP BY coalesce(Name, DisplayName)

Обратите внимание на часть _binary, которая запускаетIN() значениеКакой трюк, чтобы заставить эту работу?Будет ли версия Hibernate, которую я использую, даже делать это?Если нет, какие у меня есть альтернативы?

Заранее спасибо,

Карл

1 Ответ

33 голосов
/ 05 апреля 2011

Ответил на мой собственный вопрос и должен иметь RTFM'd перед публикацией.«Хитрость» заключается в использовании query.setParameterList() вместо query.setParameter().

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