PostgreSQL查询在pgAdmin中工作,但在Java EclipseLink中不起作用

时间:2016-03-01 12:24:49

标签: java postgresql jpa eclipselink jpql

我有一个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。

2 个答案:

答案 0 :(得分:1)

PostgreSQL可以使用trouble来解析参数绑定,在这种情况下,它表现为具有参数内联工作的本机SQL,而JPA生成的SQL默认绑定参数失败。

一种解决方案是通过传递值为“false”的"eclipselink.jdbc.bind-parameters"作为特定查询的查询提示来关闭参数绑定,或者作为一个持久性单元属性来关闭参数绑定查询。

答案 1 :(得分:0)

在postgresql上,您可以使用以下语法

GROUP BY 1

这意味着您将使用SELECT子句中的第一个选定属性对您进行分组。那可能会有所帮助