我有一个SQL,它可以计算每个日期截断(月、天、小时)的行数。想一想历史图表。如果在pgAdmin中执行查询,则查询工作良好,但在使用EclipseLink的Java中会失败。
pgAdmin查询:
SELECT date_trunc( 'hour', delivered_at ),
COUNT(date_trunc( 'hour', delivered_at )) AS num
FROM messages
WHERE channel_type='EMAIL'
AND created_at>='2016-02-28 16:01:08.882'
AND created_at<='2016-02-29 16:01:08.882'
GROUP BY date_trunc( 'hour', delivered_at );JPQL命名查询
SELECT FUNCTION('date_trunc', 'hour', m.deliveredAt ),
COUNT(FUNCTION('date_trunc', 'hour', m.deliveredAt )) AS num
FROM Message m
WHERE m.channelType = :channelType
AND m.createdAt >= :fromDate
AND m.createdAt <= :toDate
GROUP BY FUNCTION('date_trunc', 'hour', m.deliveredAt )EclipseLink调试日志:
SELECT date_trunc(?, delivered_at), COUNT(date_trunc(?, delivered_at)) FROM messages
WHERE (((channel_type = ?) AND (created_at >= ?)) AND (created_at <= ?)) GROUP BY date_trunc(?, delivered_at)
bind => [hour, hour, EMAIL, 2015-12-27 00:00:00.0, 2015-12-27 00:00:00.0, hour]错误:
错误:列"messages.delivered_at“必须出现在GROUP子句中,或用于聚合函数位置: 23
PostgreSQL日志:
2016-03-01 13:22:08 CET错误:"messages.delivered_at“列必须出现在GROUP子句中,或用于字符23 2016-03-01 13:22:08 CET语句中的聚合函数中:选择date_trunc($1,delivered_at),计数(Delivered_at)从消息WHERE ((channel_type= $2)和(created_at >= $3))和(created_at <= $4)按date_trunc分组($5,( delivered_at) 2016-03-01 13:22:08 CET日志:执行S_2:选择1
如果我替换EclipseLink日志查询中的绑定变量并在pgAdmin中执行该查询,则查询工作正常。这里发生什么事情?
编辑:只是为了澄清,它也使用em.createNativeQuery工作。
发布于 2016-03-01 17:31:24
PostgreSQL可以具有解析参数绑定的麻烦,在本例中,这种绑定显示为具有内联工作参数的原生SQL,而JPA生成的默认绑定参数的SQL失败。
一种解决方案是关闭参数绑定,方法是将值为"false“的“eclipselink.jdbc.bind-参数”作为特定查询的查询提示传递,或者作为持久性单元属性,默认情况下关闭所有查询的参数绑定。
发布于 2016-03-01 12:30:12
在postgresql上,可以使用以下语法
GROUP BY 1这意味着您将使用SELECT子句中的第一个选定属性对您进行分组。在那里可能会有帮助
https://stackoverflow.com/questions/35722890
复制相似问题