【发布时间】:2014-09-15 20:18:24
【问题描述】:
假设我的 article 数据库表中有 5 个元素:
+----+------+
| id | name |
+----+------+
| 1 | bb |
| 2 | cc |
| 3 | dd |
| 4 | ee |
| 5 | ff |
+----+------+
如果我想用 2 元素页面对结果进行分页,我将使用以下查询:
Query query = session.createQuery("from Article order by name asc");
query.setFirstResult(pageNumber);
query.setMaxResults(2);
我看了第一页:
1/bb
2/cc
在我阅读第二页之前,另一个线程在表格中插入了一个新元素6/aa(按名称排序):
+----+------+
| id | name |
+----+------+
| 6 | aa |
| 1 | bb |
| 2 | cc |
| 3 | dd |
| 4 | ee |
| 5 | ff |
+----+------+
如果我阅读第二页,我会:
2/cc
3/dd
2/cc 元素将被读取两次:重复。
有什么方法可以强制 Hibernate 在开始分页时使用的同一数据集上分页?
PS:如果第二个线程执行update 查询(例如更改元素的名称,从而更改排序结果),也可能会出现这种情况,我也想避免这种情况。哦,我不是在寻找 if-already-read-then-remove-and-add-others-until-page-is-full 解决方案;)
【问题讨论】:
-
如果更新改变了第一页的内容,那么拥有适当的第二页几乎没有什么好处,因为用户没有看到更新的第一页。
标签: java multithreading hibernate insert pagination