2011-01-05 60 views
2

我有一个表 - 我们称之为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中的第一个项目,并按顺序排列。应该做什么才能实现这一目标?

回答

1

所以,你需要在bbbs两个聚集处理的 - 一个大小来确定的,另一个找到最新的时间戳。它可以用JOINGROUP 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 
+0

你确定语法吗? “GROUP BY”在JPA中不起作用。在MySQL中它可以工作,但我使用PostgreSQL并寻找通用的JPA解决方案... – 2011-01-05 15:12:19

+0

@Eldad:GROUP BY在JPA中工作,这是一个非常有效的JPA查询。 – axtavt 2011-01-05 15:41:31

+0

在JPA文档中进一步检查,看起来你是正确的,但是在实践中它不会工作(我正在使用Hibernate)。我在尝试使用查询时遇到的异常是:“错误:列”aaa.some_aaa_column“必须出现在GROUP BY子句中或用于聚合函数中”。 – 2011-01-06 11:01:18

0

如果你正在使用Hibernate的,也许你可以使用过滤器(@Filter和@FilterDef)