我有一个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]
错误:
错误:列&#34; messages.delivered_at&#34;必须出现在GROUP BY中 条款或用于集合函数位置:23
PostgreSQL日志:
2016-03-01 13:22:08 CET ERROR:column&#34; messages.delivered_at&#34;必须 出现在GROUP BY子句中或用于聚合函数中 character 23 2016-03-01 13:22:08 CET STATEMENT:SELECT date_trunc($ 1, deliver_at),COUNT(deliver_at)FROM消息WHERE(((channel_type = $ 2)AND(created_at&gt; = $ 3))AND(created_at&lt; = $ 4))GROUP BY date_trunc($ 5,deliver_at)2016-03-01 13:22:08 CET LOG:执行 S_2:选择1
如果我从EclipseLink记录的查询中替换绑定变量并在pgAdmin中执行它,则查询可以正常工作。这是怎么回事?
编辑:为了澄清,它也可以使用em.createNativeQuery。
答案 0 :(得分:1)
PostgreSQL可以使用trouble来解析参数绑定,在这种情况下,它表现为具有参数内联工作的本机SQL,而JPA生成的SQL默认绑定参数失败。
一种解决方案是通过传递值为“false”的"eclipselink.jdbc.bind-parameters"作为特定查询的查询提示来关闭参数绑定,或者作为一个持久性单元属性来关闭参数绑定查询。
答案 1 :(得分:0)
在postgresql上,您可以使用以下语法
GROUP BY 1
这意味着您将使用SELECT子句中的第一个选定属性对您进行分组。那可能会有所帮助