2015-10-16 10 views
6

voglio creare, nel codice Java, un'impaginazione personalizzata da una lista di arrayimpaginazione personalizzata dalla lista di array

import org.springframework.data.domain.Sort; 
import org.springframework.data.domain.PageRequest; 
import org.springframework.data.domain.Page; 
import org.springframework.data.domain.PageImpl; 
import org.springframework.data.domain.Sort.Direction; 
...  

    int page = 0; 
    int count = 8; 
    String sortOrder = "desc"; 
    String sortBy = "id"; 

    Sort sort = new Sort(Direction.fromString(sortOrder), sortBy); 
    PageRequest pageable = new PageRequest(page, count, sort); 

    List<Impianto> impiantos = myService.findMyMethod(); // returned 30 objects 
    Page<Impianto> pageImpianto = new PageImpl<Impianto>(impiantos, pageable, impiantos.size()); 

Lo script di cui sopra non restituisce una pagina di 8 elementi. Perché?

N.B. la lista non è tornata da db

Potete aiutarmi?

+3

Cosa quadro stai usando? Whare sono le classi 'Sort',' PageRequest' e 'Page'? –

+0

@ Gaël È primavera. Vedi [Pagina] (http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Page.html) e [PageImpl] (http: // docs. spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/PageImpl.html#PageImpl-java.util.List-org.springframework.data.domain.Pageable-long-). –

+0

* "Lo script sopra non restituisce una pagina di 8 elementi" * ... Cosa restituisce 'getTotalElements()'? –

risposta

1

I SOLVED con questa soluzione alternativa.

import org.springframework.data.domain.Sort; 
    import org.springframework.data.domain.PageRequest; 
    import org.springframework.data.domain.Page; 
    import org.springframework.data.domain.PageImpl; 
    import org.springframework.data.domain.Sort.Direction; 
    ...  

     int page = 0; 
     int count = 8; 
     String sortOrder = "desc"; 
     String sortBy = "id"; 

     Sort sort = new Sort(Direction.fromString(sortOrder), sortBy); 
     PageRequest pageable = new PageRequest(page, count, sort); 

     List<Impianto> impiantos = myService.findMyMethod(); // returned 30 objects 
     int max = (count*(page+1)>impiantos.size())? impiantos.size(): count*(page+1); 

     Page<Impianto> pageImpianto = new PageImpl<Impianto>(impiantos.subList(page*count, max), pageable, impiantos.size()); 

e ho implementato una nuova classe di confronto personalizzato

import java.lang.reflect.Field; 
import java.util.Comparator; 
import java.util.Date; 

public class MyListComparator implements Comparator<Object> { 

    final String sortBy; 
    final String sortOrder; 

    public MyListComparator(String sortBy, String sortOrder) { 
     this.sortBy = sortBy; 
     this.sortOrder = sortOrder; 
    } 

    @Override 
    public int compare(Object o1, Object o2) { 

     try { 
      Field field1 = o1.getClass().getDeclaredField(sortBy); 
      Field field2 = o2.getClass().getDeclaredField(sortBy); 

      field1.setAccessible(true); // because the fields in Impianto entity has "private" 
      field2.setAccessible(true); 

      if(o1.getClass().getDeclaredField(sortBy).getType() == Long.class){ 
       Long d1 = (Long) field1.get(o1); 
       Long d2 = (Long) field2.get(o2); 
       return (sortOrder.toLowerCase().equals("asc"))? d1.compareTo(d2) : d2.compareTo(d1); 

      }else if(o1.getClass().getDeclaredField(sortBy).getType() == Date.class){ 
       Date d1 = (Date) field1.get(o1); 
       Date d2 = (Date) field2.get(o2); 
       return (sortOrder.toLowerCase().equals("asc"))? d1.compareTo(d2) : d2.compareTo(d1); 

      }else{ 
       String d1 = (String) field1.get(o1); 
       String d2 = (String) field2.get(o2); 
       return (sortOrder.toLowerCase().equals("asc"))? d1.compareTo(d2) : d2.compareTo(d1); 

      } 
     } catch (SecurityException e) { 
      throw new RuntimeException(e); 
     } catch (NoSuchFieldException e) { 
      throw new RuntimeException("Missing variable sortBy"); 
     }catch (ClassCastException e) { 
      throw new RuntimeException("sortBy is not found in class list"); 
     } catch (IllegalArgumentException e) { 
      //shoud not happen 
      throw new RuntimeException(e); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } 
    } 


}