JSF 2 - meu sortBy e filterBy do primefaces 3 NÃO FUNCIONA

1 resposta
C

Boa noite galera, já pesquisei bastante sobre esses metodos para ordenar e filtrar utilizando o primefaces com o dataTabe mas não sei onde estou errando.
quando eu coloco algum valor no filtro ele diz que nenhum valor foi encontrado e quando eu apago o valor da pesquisa, todos os resultados aparecem novamente.

segue o meu codigo : xhtml

<h:form id="form" rendered="#{LoginMB.logado}">  
  <p:growl id="growl" showDetail="true"  />
      <p:dataTable var="hot" value="#{hotelMB.lazyModel}" paginator="true" rows="15"  
                 paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"  
                 rowsPerPageTemplate="5,10,15,20,25" selectionMode="single" selection="#{hotelMB.hotel}" id="hotTable" lazy="true" rowKey="#{hot.id_hotel}" >  
          
          <p:ajax event="rowSelect" update=":form:display" oncomplete="hotDialog.show()" />  
  
        <f:facet name="header" >  
            Hotéis  
        </f:facet>  
  
        <p:column headerText="Nome Hotel"  sortBy="#{hot.nomeHotel}" filterBy="#{hot.nomeHotel}" id="nomeHotel">  
            #{hot.nomeHotel}  
        </p:column>  
  
        <p:column headerText="Razão Social" sortBy="#{hot.razaoSocial}" filterBy="#{hot.razaoSocial}" id="razaoSocial">  
            #{hot.razaoSocial}  
        </p:column>  
  
        <p:column headerText="Cnpj" sortBy="#{hot.cnpj}" filterBy="#{hot.cnpj}" id="cnpj">  
            #{hot.cnpj}  
        </p:column>  
  
        <p:column headerText="Endereço" sortBy="#{hot.endereco}" filterBy="#{hot.endereco}" id="endereco">  
            #{hot.endereco}  
        </p:column>  
  
    </p:dataTable>

meu ManagedBean :

@ManagedBean(name="hotelMB")
@SessionScoped
public class HotelMB implements Serializable{
    
    private HotelBean hotel;
    private ArrayList<HotelBean> list_hoteis;
    private LazyDataModel<HotelBean> lazyModel;
    
    public HotelMB(){
        hotel = new HotelBean();
                
    }

    public HotelBean getHotel() {
        return hotel;
    }

    public void setHotel(HotelBean hotel) {
        this.hotel = hotel;
    }

    public LazyDataModel<HotelBean> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<HotelBean> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public ArrayList<HotelBean> getList_hoteis() {
        return list_hoteis;
    }

    public void setList_hoteis(ArrayList<HotelBean> list_hoteis) {
        this.list_hoteis = list_hoteis;
    }
    
    
    
    
    public String consultaHoteis(){
        try {
            HotelDAO dao_Hotel = new HotelDAO();
            
            list_hoteis = new ArrayList();
            list_hoteis = dao_Hotel.hoteis();
            
            lazyModel = new LazyHotelDataModel(list_hoteis);
        
        
       // return list_hoteis;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(HotelMB.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(HotelMB.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "consultaHotel.xhtml?faces-redirect=true";
    }
    
}

minha classe LazyHotelDataModel :

public class LazyHotelDataModel extends LazyDataModel<HotelBean>{
    
    private List<HotelBean> datasource; 
    
    public LazyHotelDataModel(List<HotelBean> datasource) {  
        this.datasource = datasource;  
    } 

    @Override
    public List<HotelBean> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {  
        List<HotelBean> data = new ArrayList<HotelBean>();  
  
        //filter  
        for(HotelBean hotel : datasource) {  
            boolean match = true;  
  
            for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {  
                try {  
                    String filterProperty = it.next();  
                    String filterValue = filters.get(filterProperty);  
                    String fieldValue = String.valueOf(hotel.getClass().getField(filterProperty).get(hotel));  
  
                    if(filterValue == null || fieldValue.startsWith(filterValue)) {  
                        match = true;  
                    }  
                    else {  
                        match = false;  
                        break;  
                    }  
                } catch(Exception e) {  
                    match = false;  
                }   
            }  
  
            if(match) {  
                data.add(hotel);  
            }  
        }  
  
        //sort  
        if(sortField != null) {            
            Collections.sort(data, new LazySorterHotel(sortField, sortOrder));
        }
        
  
        //rowCount  
        int dataSize = data.size();  
        this.setRowCount(dataSize);  
  
        //paginate  
        if(dataSize > pageSize) {  
            try {  
                return data.subList(first, first + pageSize);  
            }  
            catch(IndexOutOfBoundsException e) {  
                return data.subList(first, first + (dataSize % pageSize));  
            }  
        }  
        else {  
            return data;  
        }  
    }
    
}

o que eu realmente preciso para o metodo sortBy e filterBy do primefaces funcione ??

1 Resposta

M

Olá amigo…
tambem estava com esse problema, e consegui graças a esse topico
http://www.guj.com.br/java/268090-sortby-do-datatable-nao-funciona---primefaces

Evite carregar sua lista de dados nos getters. Tente uma chamada de inicialização no @PostConstruct para carregar os dados iniciais, pois quando eles são chamados muitas vezes resulta neste tipo de problema de classificação e desempenho. Algo assim…

private List<Entidade> findAll;
        ....
	@PostConstruct
	public void construct() {
		//code
		findAll = seuEJB.findAll();
	}

	public List<Entidade> findAll(){
		return findAll;
	}
        ...

xhtml

Criado 5 de agosto de 2012
Ultima resposta 24 de out. de 2012
Respostas 1
Participantes 2