在看看JpaPagingItemReader的實現,你會找到方法doReadPage():
@Override
@SuppressWarnings("unchecked")
protected void doReadPage() {
EntityTransaction tx = null;
if (transacted) {
tx = entityManager.getTransaction();
tx.begin();
entityManager.flush();
entityManager.clear();
}//end if
Query query = createQuery().setFirstResult(getPage() * getPageSize()).setMaxResults(getPageSize());
if (parameterValues != null) {
for (Map.Entry<String, Object> me : parameterValues.entrySet()) {
query.setParameter(me.getKey(), me.getValue());
}
}
if (results == null) {
results = new CopyOnWriteArrayList<T>();
}
else {
results.clear();
}
if (!transacted) {
List<T> queryResult = query.getResultList();
for (T entity : queryResult) {
entityManager.detach(entity);
results.add(entity);
}//end if
} else {
results.addAll(query.getResultList());
tx.commit();
}//end if
}
正如你所看到的,對於每個被讀取頁面時,會爲每個頁面創建一個新的查詢。因此,必須確保您的查詢始終返回相同順序的確切元素的相同數量相同數量的,因此,它需要一個「唯一排序鍵」。否則,您將會有重複項和缺失項(每個重複項都會有一個缺失項,因爲總行數將相同)。
這非常合理。我認爲實施是理所當然的。我對它執行了一個單一查詢的內部思路,它在內部返回整個結果,然後在調用getPage()時將這些結果分塊。感謝Hansjoerg的解釋。 – Randy