JPA根据有序选择计算排名

时间:2012-03-13 15:21:36

标签: jpa

说,我有下表。

USER_POINT
  USER_ID    | BIGINT | PK
  USER_POINT | BIGINT |

'USER_POINT'可能会不断更新 给定USER_ID我想要USER_POINT排序的选择中顶部的距离数。

SEQ    USER_ID  USER_POINT
-----  -------  -----------
00001  232132   32423423432
00002  023944   32423423431
.....  ......   ...........
01007  000034   xxxxxxxxxxx // I want to know the 01007 with given 000034

我还没有编程但是这里有一些我将要尝试的伪代码。

public int getRank(final Long userId) {
    final int pageSize = 500;
    int pageCount = 0;
    int firstResult = 0;
    for (int firstResult = 0; true; firstResult += pageSize) {
        final Query query = em.createQuery(
            "SELECT u.id FROM UserPoint u ORDER BY u.point");
        query.setFirstResult(firstResult);
        query.setMaxResults(pageSize);
        final List orders = query.getResultList();
        if (orders.isEmpty()) {
            break;
        }
        final int index = orders.indexOf(userId);
        if (index != -1) {
            return pageSize * pageCount + index;
        }
        pageCount++;
    }
    return -1;
}

我想问一下

Is this the right way?
Is this the only way?

谢谢。

1 个答案:

答案 0 :(得分:1)

JPQL不支持此类查询。如果要使这些查询有效,则应该使用SQL进行此类查询。

在Oracle中,这样的查询看起来像

select r from (select user_id, user_point, rownum as r 
               from user_point 
               order by user_point desc) where user_id = 34