【问题标题】:Why does setFirstResult() in Query takes int parameter?为什么 Query 中的 setFirstResult() 需要 int 参数?
【发布时间】:2016-12-23 16:04:18
【问题描述】:

我正在用 Java 实现自定义分页,我想知道为什么 Query 的 setFirstResult() 方法需要 int 作为参数?就是说DB中的行数超过2.147.483.647之后就不能分页了?

有没有办法用 long 代替?

【问题讨论】:

  • 严重吗?您要对 20 亿条记录进行分页吗?
  • 只是理论上的,例如我认为 FB 有超过 20 亿个帖子
  • 如果你有这么大的结果集,我认为你需要在查询条件中分页(出于性能原因你可能不得不这样做)。
  • @Thilo 我的知识有限,但据我了解,您不能在 JPQL 中明确使用 LIMIT(x,y) (至少我不能),Query 为您解决了这个问题(@987654322 @),所以基本上这就是查询条件。
  • @Peter 没有真正的用例可以使用如此庞大的结果集进行分页。如果你认为你需要它,那么你在某个地方犯了一个严重的设计缺陷。

标签: jpa pagination api-design


【解决方案1】:

因为int 已经足够大了。考虑到在使用LIMIT/OFFSET 时,建议使用ORDER BY 子句以获得可靠的结果(否则您可能会在多个页面上获得相同的行),结果集包含 20 亿行,您将在服务器上对结果进行排序,然后跳过OFFSET 行来获取您的页面,即使在达到int 的限制之前,它也会非常低效。

【讨论】:

  • ...意思是对庞大的数据集进行分页,无论如何你都必须将WHERE sortField1 >= ? AND sortField2>=? AND id > ? 之类的东西放入查询中(即手动分页,无需OFFSET)
  • @Thilo Exactomundo.
  • 我猜你关于 ORDER BY 的推理是足够有效的。谢谢你们!
  • 实际上更像WHERE sortField1 > ? OR (sortField1 = ? AND ( sortField2 > ? OR (sortField2 = ? AND id > ?)))...不漂亮(除非您正在对单个且唯一的键进行排序)。但对于性能是必需的。
  • 另外,如果你要分页十亿条记录,很可能会有并发更新,也会弄乱分页。
猜你喜欢
  • 2019-03-11
  • 2021-08-05
  • 1970-01-01
  • 2010-12-12
  • 2015-11-07
  • 2023-02-03
  • 2015-12-08
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多