W moim JSF datatable zaimplementowałem leniwy ładowanie i kiedy będę stronił przez rekordy, to zajmuje to około 4 lub 5 sekund, aby wykonać następny zestaw rekordów, faktycznie powinien on być poświęcić mniej niż sekundę, aby wykonać wyniki.Jak wyszukiwać dane dla Primefaces dataTable za pomocą leniwego ładowania i stronicowania
To się stało w sposób, w jaki go wdrożyłem, nie wiem, jak mogę to rozwiązać.
klasa DataModel która rozciąga 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;
}
oraz w klasie dao
@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();
}
Może ktoś wyjaśnić, co spowodowało to opóźnienie w Stronicowanie poprzez zapisy?
Jeśli usunąć następujące
if (requestList.size() > maxPerPage)
{
System.out.println("executing");
return requestList.subList(startingAt, startingAt + maxPerPage);
}
else
{
System.out.println("executing else ");
return requestList;
}
i wykonać, to wykonuje doskonale bez zwłoki, jednak problem jest this.setRowCount(requestList.size());
zawsze 5, który jest moją domyślną liczbę rekordów na stronie.
Aktualizacja 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;
}
}
Używane innego zapytania dla uzyskania rachubę wynikowego używając następującej
@Override
public int count() {
int count = ((Long) sessionFactory.getCurrentSession()
.createQuery("select count(*) from Request").uniqueResult())
.intValue();
System.out.println(" count size " + count);
return count;
}
i mojego DAO
@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();
}
Próbowałem z 2 różnymi zapytaniami, dodałem mój kod jako Update 2, edytując moje pytanie. Tutaj problem polega na tym, że po paginacji do strony drugiej dostaję 'java.lang.IndexOutOfBoundsException' pomimo tego, że łapię ten wyjątek, widzę mój kod. Co mogłoby być tego przyczyną? – user75ponic
Musisz użyć filtrów również w zapytaniu o liczbę. – perissf
Czy mógłbyś podać przykład, jak uzyskać 1) jeden dla zliczenia przefiltrowanego wyniku Ustaw (pozwoliłem db zrobić liczenie) 2) do pobierania paginated resultSet (pozwoliłem db wyodrębnić podlistę). Dzięki – user75ponic