从主记录访问基于列表的记录
问题描述:
我有一个表 - 我们称之为AAA,它具有一个一对多定义到一个附加表,分配BBB。它看起来就像这样:从主记录访问基于列表的记录
public class AAA
{
...
@OneToMany(orphanRemoval=true, fetch=FetchType.LAZY, mappedBy="aaa")
private List<BBB> bbbs;
...
}
我想运行一个JPA查询,这将使我的一切,有一个以上的商务改善局美国科学促进会,所以我用SIZE(aaa.bbbs)
。但是,我希望结果集按每个aaa中第一个bbb的时间戳排序。
一个现实生活中的例子:我想要得到我所有的Facebook好友,按照最新的图片排序,每张图片都添加到他们的个人资料中。在这种情况下AAA是一个“朋友”,BBB将是“图片”,我想通过Picture.CreatedTimestamp订购朋友。
我基本上需要访问每个aaa的bbbs中的第一个项目,并按顺序排列。应该做什么才能实现这一目标?
答
所以,你需要在bbbs
两个聚集处理的 - 一个大小来确定的,另一个找到最新的时间戳。它可以用JOIN
和GROUP BY
表示:
SELECT a
FROM AAA a JOIN a.bbbs b
GROUP BY a.id, a.column1, a.column2
HAVING COUNT(b) > 1
ORDER BY MAX(b.timestamp) DESC
答
如果你正在使用Hibernate的,也许你可以使用过滤器(@Filter和@FilterDef)
你确定语法吗? “GROUP BY”在JPA中不起作用。在MySQL中它可以工作,但我使用PostgreSQL并寻找通用的JPA解决方案... – 2011-01-05 15:12:19
@Eldad:GROUP BY在JPA中工作,这是一个非常有效的JPA查询。 – axtavt 2011-01-05 15:41:31
在JPA文档中进一步检查,看起来你是正确的,但是在实践中它不会工作(我正在使用Hibernate)。我在尝试使用查询时遇到的异常是:“错误:列”aaa.some_aaa_column“必须出现在GROUP BY子句中或用于聚合函数中”。 – 2011-01-06 11:01:18