尝试使用GROUP BY时Hibernate / PostgreSQL JPAQueryException

时间:2012-10-14 10:50:32

标签: hibernate postgresql heroku playframework hql

我使用Hibernate获得以下异常:

  
    

发生JPAQueryException:执行查询的错误选择f从Flyer作为f连接f.events为e,其中e.start> ?和e.start< ?和f.popularityTag> 1个按f顺序乘以sqrt(( - 118.39419-f.venue.lng)*( - 118.39419-f.venue.lng)+(34.024353-f.venue.lat)*(34.024353-f.venue.lat)) asc:ERROR:column" venue2_.lng"必须出现在GROUP BY子句中或用于聚合函数

  

以上显示了查询的HQL。 HQL生成的SQL如下:

  
    

选择flyer0_.id作为id345_,flyer0_.venue_id作为场地77_345_来自传单flyer0_内部加入活动events1_ on flyer0_.id = events1_.flyer_id交叉加入场地场地2_其中flyer0_.venue_id = venue2_.id和events1_.start>?和events1_.start1分组由flyer0_.id命令由sqrt(( - 118.39419-venue2_.lng)*( - 118.39419-venue2_.lng)+(34.024353-venue2_.lat)*(34.024353-venue2_.lat))asc limit?

  

表格是传单,事件和地点。

事件表跟踪传单的开始和停止时间......传单可以在多天重复...因此有多个事件。

每个Flyer都有一个Venue,会在Flyer上刊登广告。

就我的数据库而言,我使用的是Heroku PostgreSQL Crane,如以下网址所述。我相信它使用PostgreSQL 9.1:

在休眠方面,我使用的Play Framework 1.2.5似乎在使用:

- org.hibernate -> hibernate-core 3.6.10.Final
- org.hibernate -> hibernate-commons-annotations 3.2.0.Final
- org.hibernate -> hibernate-entitymanager 3.6.10.Final
- org.hibernate -> hibernate-validator 4.1.0.Final

MY QUESTION是导致JPAQueryException的原因,我该如何修复它?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为问题在于,在Pg 9.1及以下版本中,您必须列出SELECT中出现的ORDER BY中的所有列,除非它们在聚合中使用。 9.2及以上版本可以判断,如果PRIMARY KEY列在GROUP BY中,那么其他所有内容也会被隐式分组。

看起来您可以通过合并子查询来重新表达查询以解决问题:

select f
from Flyer as f
where exists (
  SELECT 1 FROM f.events as e
  where e.start > ? and e.start < ? and f.popularityTag > 1
)
order by sqrt((-118.39419-f.venue.lng) * (-118.39419-f.venue.lng)+(34.024353-f.venue.lat)*(34.024353-f.venue.lat)) asc

我没有测试过,我没有多写HQL,所以你可能需要调整它,但这个想法应该继续下去。