0

我使用 Hibernate 得到以下异常:

JPAQueryException 发生:执行查询时出错 select f from Flyer as f join f.events as e where 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.场地.lat)) asc:错误:列“venue2_.lng”必须出现在 GROUP BY 子句中或用于聚合函数

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

选择 flyer0_.id 作为 id345_,flyer0_.venue_id 作为venue77_345_ from flyer0_inner join event events1_ on flyer0_.id=events1_.flyer_id 交叉加入场地venue2_ where 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)) 顺序分组

表格是传单、活动和场地。

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

每个传单都有一个场地,传单上的广告将在那里进行。

就我的数据库而言,我使用的是 Heroku PostgreSQL Crane,如以下 URL 中所述。我相信它使用 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

我的问题是导致 JPAQueryException 的原因,我该如何解决?

谢谢!

4

1 回答 1

1

我认为问题在于,在 Pg 9.1 及以下版本中,您必须列出 ORDER BY 中出现在 SELECT 中的所有列,除非它们在聚合中使用。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 也不多,所以你可能需要调整它,但这个想法应该得到贯彻。

于 2012-10-14T11:43:15.483 回答