Come interrogare i dati per DataTempo Primefaces usando il caricamento e l’impaginazione pigri

Nel databile del mio JSF ho implementato il caricamento lento e quando impaginato i record ci vuole del tempo circa 4 o 5 secondi per eseguire il prossimo set di record, in realtà dovrebbe essere necessario meno di un secondo per eseguire i risultati.

Questo è successo nel modo in cui l’ho implementato, non sono sicuro di come potrei risolvere questo problema.

Classe DataModel che estende LazyDataModel

@Override public List load(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder, Map 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; } 

e in class dao

 @Override public List getRequest(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder, Map filters) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria( Request.class); criteria.addOrder(Order.desc("requestNo")); for (Map.Entry entry : filters.entrySet()) { if (entry.getValue() != null) { criteria.add(Restrictions.ilike("requestNo", "%" + entry.getValue() + "%")); } } //criteria.setMaxResults(maxPerPage); //criteria.setFirstResult(startingAt); return criteria.list(); } 

Qualcuno potrebbe spiegare cosa ha causato questo ritardo nell’impaginazione attraverso i registri?

Se rimuovo il seguente

 if (requestList.size() > maxPerPage) { System.out.println("executing"); return requestList.subList(startingAt, startingAt + maxPerPage); } else { System.out.println("executing else "); return requestList; } 

ed esegue, quindi viene eseguito perfettamente senza indugio, tuttavia il problema è this.setRowCount(requestList.size()); sempre 5, che è il mio numero predefinito di record per pagina.

Aggiornamento 2

 @Override public List load(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder, Map 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; } } 

Ha utilizzato una query diversa per ottenere il conteggio dei risultati utilizzando il seguente

 @Override public int count() { int count = ((Long) sessionFactory.getCurrentSession() .createQuery("select count(*) from Request").uniqueResult()) .intValue(); System.out.println(" count size " + count); return count; } 

e il mio dao

 @Override public List getRequest(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder, Map filters) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria( Request.class); criteria.addOrder(Order.desc("requestNo")); for (Map.Entry entry : filters.entrySet()) { if (entry.getValue() != null) { criteria.add(Restrictions.ilike("requestNo", "%" + entry.getValue() + "%")); } } criteria.setMaxResults(maxPerPage); criteria.setFirstResult(startingAt); return criteria.list(); }