在我的JSF的數據表中,我已經實現了延遲加載,當通過記錄進行分頁時,需要花費大約4或5秒的時間來執行下一組記錄,實際上它應該是採取不到一秒的時間來執行結果。如何使用延遲加載和分頁查詢Primefaces數據表的數據
這發生在我已經實現它的方式,不知道我怎麼能解決這個問題。
延伸LazyDataModel
@Override
public List<Request> load(int startingAt, int maxPerPage, String sortField,
SortOrder sortOrder, Map<String, String> filters)
{
requestList = requestService.getRequest(startingAt, maxPerPage,
sortField, sortOrder, filters);
this.setRowCount(requestList.size());
if (requestList.size() > maxPerPage)
{
System.out.println("executing");
return requestList.subList(startingAt, startingAt + maxPerPage);
}
else
{
System.out.println("executing else ");
return requestList;
}
return requestList;
}
和DAO類的DataModel類
@Override
public List<Request> getRequest(int startingAt, int maxPerPage,
String sortField, SortOrder sortOrder, Map<String, String> filters)
{
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
Request.class);
criteria.addOrder(Order.desc("requestNo"));
for (Map.Entry<String, String> entry : filters.entrySet())
{
if (entry.getValue() != null)
{
criteria.add(Restrictions.ilike("requestNo",
"%" + entry.getValue() + "%"));
}
}
//criteria.setMaxResults(maxPerPage);
//criteria.setFirstResult(startingAt);
return criteria.list();
}
有人能解釋一下是什麼原因導致在通過記錄分頁這種延遲?
如果我刪除以下
if (requestList.size() > maxPerPage)
{
System.out.println("executing");
return requestList.subList(startingAt, startingAt + maxPerPage);
}
else
{
System.out.println("executing else ");
return requestList;
}
和執行,那麼它是完全執行無延遲,但問題是this.setRowCount(requestList.size());
總是5這是我的每頁記錄的默認號碼。
更新2
@Override
public List<Request> load(int startingAt, int maxPerPage, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
requestList = requestService.getRequest(startingAt, maxPerPage,
sortField, sortOrder, filters);
this.setRowCount(requestService.getRequestCount());
if (requestService.getRequestCount() > maxPerPage) {
try {
return requestList.subList(startingAt, startingAt + maxPerPage);
} catch (IndexOutOfBoundsException e) {
//e.printStackTrace();
return requestList.subList(startingAt, startingAt
+ (requestService.getRequestCount() % maxPerPage));
}
} else {
return requestList;
}
}
用於使用得到的結果集的數量不同的查詢以下
@Override
public int count() {
int count = ((Long) sessionFactory.getCurrentSession()
.createQuery("select count(*) from Request").uniqueResult())
.intValue();
System.out.println(" count size " + count);
return count;
}
和吾道
@Override
public List<Request> getRequest(int startingAt, int maxPerPage,
String sortField, SortOrder sortOrder, Map<String, String> filters) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
Request.class);
criteria.addOrder(Order.desc("requestNo"));
for (Map.Entry<String, String> entry : filters.entrySet()) {
if (entry.getValue() != null) {
criteria.add(Restrictions.ilike("requestNo",
"%" + entry.getValue() + "%")); }
}
criteria.setMaxResults(maxPerPage);
criteria.setFirstResult(startingAt);
return criteria.list();
}
我嘗試了2個不同的查詢,我通過編輯我的問題將我的代碼添加爲Update 2。這裏的問題是,當我分頁到第二頁時,我得到了'java.lang.IndexOutOfBoundsException',即使我正在捕獲該異常,請參閱我的代碼。這可能是什麼原因? – user75ponic
您還需要在計數查詢中使用過濾器。 – perissf
你可以提供一個例子,如何獲得1)一個用於計數過濾的結果集(我讓數據庫做的)2)用於檢索分頁結果集(我讓數據庫提取子列表)。謝謝 – user75ponic