在ORDER子句中使用子查询进行JPA查询

时间:2014-09-17 16:09:55

标签: java sql jpa eclipselink aggregate

我有两张表,让他们称之为人和兴趣。一个人可以有很多兴趣。我现在要做的就是根据他们的兴趣数量生成一份人员名单。我对每个人有多少兴趣不感兴趣,我只想以这种方式排序列表(我仍然希望从查询中获得整个Person实体)

在纯SQL中,这将是一个类似的查询:

SELECT p.*, COUNT(i.id) as cnt FROM person p, interest i WHERE p.id = i.person_id ORDER BY cnt DESC

但我无法弄清楚如何在JPA中获得这样的查询。我尝试了以下方法:

Join<Person, Interest> interests = rootPerson.join("interests", JoinType.LEFT);
criteriaQuery.orderBy(builder.desc(builder.count(interests)))

但这并不能产生正确的数据。

我也尝试编写子查询,但我不确定如何在ORDER by子句中使用子查询。

有什么想法吗? 谢谢;)

1 个答案:

答案 0 :(得分:0)

你所展示的SQL从Interests到Person有一个1:1,所以我假设你的对象模型会有一个人物实体,其中1:M回归对集合'兴趣'的兴趣。如果是这样,JPQL将是:   “按人数p顺序选择p(p.interests)”。可能不会直接在order by子句中允许这样的大小,因此您可能必须使用“通过cnt从Person p order中选择p,count(p.interests)作为cnt”来更接近地匹配您的SQL。如果这样做,它可以很容易地转换为标准。