2011-04-04 32 views
10

以与此处发现的问题类似的方式:Using IN clause in a native sql query;我试图通过Hibernate中的本地SQL查询来使用IN()子句。虽然另一个问题的作者能够使用JPA,但我不是。另外,我坚持使用3.2.2版本。在带有Hibernate 3.2.2的原生SQL查询中使用IN子句

它好像Hibernate不支持原生IN()因为它正试图应用查询参数时,我的ID列表(长原语的数组)转换成二进制形式:query.setParameter("publisherGroups", [1243536264532,1243536264533,1243536264535]);

从休眠状态:

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版本甚至会这样做?如果没有,我有什么替代方案?

由于提前,

卡尔

回答

30

回答我自己的问题,并在发布前应该有RTFM'd。 “诀窍”是使用query.setParameterList()而不是query.setParameter()

+0

感谢您对我的了解:) – Rake36 2011-11-24 00:40:25

+0

+1添加解决方案。 – kriver 2012-09-06 18:46:54

+0

1添加解决方案 – Chad 2015-07-17 06:50:16