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

Ily*_*ich 5 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
Run Code Online (Sandbox Code Playgroud)

新闻有一位作者,许多标签和评论.我用给定的作者和标签选择新闻,并根据评论的次数对它们进行排序.

使用JDBC时,我已经解决了这些问题rownum.

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

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

小智 1

我很确定可以做更好的事情,但这是我面临类似问题时的解决方法:

SELECT l.id FROM Lines l WHERE l.date < :date ORDER BY l.date DESC
Run Code Online (Sandbox Code Playgroud)

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

  • WHERE l.date < :date - 您选择被视为“低于”的所有记录(在我的情况下,时间较早)
  • ORDER BY l.date DESC - 您按日期按降序排列该列表
  • SELECT l.id FROM Lines l - 返回“半有序列表”的 id
  • 我正在寻找的显然是该列表中的第一个(如果列表不为空)

这个想法是将结果分为两个主要列表,一个列表中的所有结果“高于”您想要的结果,另一个列表中的所有结果“低于”。然后你对它们进行排序并得到第一个结果。

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

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