3

我使用这段代码在 mysql 中进行分页(使用 Struts 2 + Hibernate):

Query query=getSession().createQuery("from GovOffice");
query.setFirstResult(0);
query.setMaxResult(100);
List<GovOffice> list=query.list();

这将返回从第一条记录开始的 GovOffice 列表,每页显示 100 条记录。

假设我有 100,000 条记录,这个查询“来自 GovOffice”是否首先获取所有 100,000 条记录?通过 setFirstResult 和 setMaxReSult 它将限制从 100,000 到 100 条记录。如果这是真的,则意味着分页必须是无用的。

如果没有,有什么方法可以证明在我们调用之前查询不会从数据库中获取数据query.list()

4

2 回答 2

5

QuerysetFirstResultsetMaxResult使用数据库的潜在可能性。

在 MySQL 的情况下,它是limit

所以,不,它不会获取所有记录,是的,它很有效。

源代码中的证明(org.hibernate.dialect.MySQLDialect):

238 public String getLimitString(String sql, boolean hasOffset) {
239     return new StringBuffer( sql.length()+20 )
240         .append(sql)
241         .append( hasOffset ? " limit ?, ?" : " limit ?")
242         .toString();
243 }
于 2012-07-13T14:30:41.330 回答
3

我认为文档清楚地表明,只会从数据库中检索最大结果。

setMaxResults(int)

在我看来,这相当于

SELECT * FROM GovOffice LIMIT 0, 100;
于 2012-07-13T14:30:34.640 回答