JPA在select中获得上一个和下一个记录

时间:2015-07-23 13:34:00

标签: java database jpa jpql

我有一个JPQL查询,它从数据库中检索已排序的实体列表。我有其中一个实体的id。如何在我的选择中使用已知ID获取记录的上一条和下一条记录?

select distinct n from News n 
    inner join n.author a 
    inner join n.tags t 
    where a.id = :authorId and t.id in :tagsId 
    order by size(n.comments) desc

新闻有一位作者,很多标签和评论。我用给定的作者和标签选择新闻,并按照评论的次数对它们进行排序。

在使用JDBC时,我使用rownum解决了这些问题。

我可以使用JPA获取结果中记录的位置(rownum)吗? 如果我知道记录的位置,我可以将第一个结果定义到该位置 - 1,并且对于给定查询,最大结果为3。这就是我可以获得之前,当前和下一个新闻的方式。

除了遍历新闻列表外,还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

我很确定可以做得更好,但这是我遇到类似问题时的解决方法:

SELECT l.id FROM Lines l WHERE l.date < :date ORDER BY l.date DESC

我想要的是检索上一个日期的ID(“ previous”的意思是要适应您的情况)。详细步骤如下:

  • l.date <:date 的位置-您选择所有被认为“低于”(在我的情况下,时间更早)的记录
  • 按日期DESC排序-您按降序排列该日期列表
  • 从l行中选择l.id -您返回该“一半和有序列表”的ID
  • 我一直在寻找的那个列表中的第一个(如果列表不为空)

这个想法是将结果分为两个主要列表,一个列表的所有结果都在所需的“上方”,而另一个列表的结果则在“下方”。然后您订购它们并获得第一个结果。

我认为可以将其改进为单个查询,而不是两个查询,但是我不确定如何。

希望它可以帮助您或其他有类似问题的人。