【问题标题】:Select records by first row and page size按第一行和页面大小选择记录
【发布时间】:2013-09-18 18:58:55
【问题描述】:

我正在尝试在前端实现延迟加载和分页。前端为我提供了以下两个变量:

  • firstRow - 选择查询结果中要返回的第一条记录的索引。
  • pageSize - 选择查询必须返回的记录的总大小,从 firstRow 开始。

如何在 MyBatis 的选择查询中使用它们以返回所需的记录子集?

【问题讨论】:

  • 原理和JPA/Hibernate/whatever中的一样。只需让 MyBatis 触发一个 SQL 查询,它会准确返回以 first 开头且大小为 pageSize 的记录子集,这些记录作为在 LazyDataModel#load() 方法中提供给您的参数。就这样。问题绝对不在 JSF/PrimeFaces 方面。我建议重新构建问题以省略 JSF/PrimeFaces 噪音(这与 MyBatis 用户无关并且可能会混淆)并重新询问如何在 MyBatis 中基于 2 个包含第一个变量的变量触发 LIMIT/OFFSET SQL 查询索引和结果大小。
  • @BalusC 谢谢,我编辑了我的问题,这是我第一次面对延迟加载,所以我什么都不知道,也找不到任何真正的 mybatis 实现(至少还没有)。会继续寻找
  • 还是不好。我重新表述了你的问题。
  • @BalusC 好的,听起来比我的版本好...谢谢!

标签: pagination mybatis


【解决方案1】:

在 mybatis 中分页并没有什么神奇之处,只需编写查询然后使用行号对其进行子集化。分页语法会因数据库而异,但这里是一个 oracle 示例。

select *
from (
  select r.*, rownum rnum,
  from (# base query goes here #) r
)
where rnum >= (#{firstRow}) 
and rnum < #{firstRow} + #{pageSize}

【讨论】:

  • 我现在正在使用它,但它很慢,你认为你的查询会更有效吗?
  • 它们本质上是一样的。您在有序分区上显式使用 row_number 函数。我正在使用 Oracle 的 rownum 伪列,并让优化器确定如何最好地实现应该导致相同执行计划的排序和窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多