说,我有下表。
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?
谢谢。
答案 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