【问题标题】:JPQL query - order by countJPQL 查询 - 按计数排序
【发布时间】:2013-04-17 04:13:24
【问题描述】:

我需要实现一个命名查询,它返回一个按参加活动的朋友数量排序的活动列表。

例如,此查询返回按参加活动的人数排序的活动列表:

    SELECT r.event
    FROM RSVP AS r 
    JOIN r.event.rsvpList rr 
    WHERE r.profile.user.uuid = :userUuid 
    AND r.rsvpStatus = RSVPStatus.ATTENDING 
    GROUP BY r.event 
    ORDER BY COUNT(rr) DESC

或者其他例子,好友事件列表:

        SELECT r.event 
        FROM RSVP AS r 
        WHERE r.profile IN 
            (   SELECT f.profileTo 
                FROM Friend f 
                WHERE f.profileFrom.user.uuid = :userUuid
            )
        AND r.rsvpStatus = :rsvpStatus  
        GROUP BY r.event 

我尝试执行以下操作:

    SELECT r.event
    FROM RSVP AS r 
    JOIN r.event.rsvpList rr 
    WHERE r.profile.user.uuid = :userUuid 
    AND r.rsvpStatus = RSVPStatus.ATTENDING
    AND rr.profile IN
        (
            SELECT f.profileTo 
            FROM Friend f 
            WHERE f.profileFrom.user.uuid = :userUuid
        )       
    GROUP BY r.event 
    ORDER BY COUNT(rr) DESC

但是这个查询返回了发生在朋友身上的事件并跳过了其他事件。

这是我的数据库的简化图:

【问题讨论】:

  • @Aquillo,抱歉,提前发布了一个问题。
  • 是顺序的问题,还是一般的结果?

标签: sql jpa hql jpql


【解决方案1】:

您没有发布您的实体,所以我无法尝试,但我认为这应该可行:

SELECT r.event, (
    SELECT count(*)
    FROM RSVP rr
    WHERE rr.event = r.event
        AND rr.profile IN
        (
            SELECT f.profileTo 
            FROM Friend f 
            WHERE f.profileFrom.user.uuid = :userUuid
        )
    ) count
FROM RSVP AS r 
WHERE r.profile.user.uuid = :userUuid 
    AND r.rsvpStatus = RSVPStatus.ATTENDING      
ORDER BY 2 DESC

这里的问题是 HQL 不支持 ORDER BY 子句中的子查询,因此您必须再选择一列来进行排序。

【讨论】:

  • 谢谢!结果,我使用了这个查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2011-06-25
  • 2019-02-20
  • 1970-01-01
  • 2012-09-17
  • 2013-03-13
  • 1970-01-01
相关资源
最近更新 更多