【问题标题】:JPA get the previous and next record in selectJPA在select中获取上一条和下一条记录
【发布时间】:2023-11-10 15:35:02
【问题描述】:

我有一个 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

News 有一个作者,许多标签和 cmets。我选择具有给定作者和标签的新闻,并根据他们的 cmets 数对它们进行排序。

在使用 JDBC 时,我使用 rownum 解决了此类问题。

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

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

【问题讨论】:

  • 我认为你必须遍历列表并找出答案。
  • @manoj 如果数据库中有数百万条记录怎么办?我所需要的只是得到其中两个。
  • @X.L.Ant 我提供了有问题的查询。
  • 我不明白反对意见 - 我认为这是一个合理的问题......

标签: java database jpa jpql


【解决方案1】:

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

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

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

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

这个想法是将结果分成两个主要列表,一个包含所有结果“高于”您想要的结果,另一个包含“低于”结果。然后您订购它们并获得第一个结果。

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

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

【讨论】:

    最近更新 更多