2012-06-27 51 views
2

嗨,大家好,我有lazyDataModel的实现按照本教程本教程http://uaihebert.com/?p=1120实现在primefaces全局过滤DataTable中使用延迟加载

我的代码它有点不同,那就是:

查看:

<p:dataTable id="tablaClientes" value="#{AgendaManualMBean.allClientes}" 
    var="tablaClientes" 
    widgetVar="clienteTable" 
    rowKey="#{tablaClientes.clDocid}" 
    selection="#{AgendaManualMBean.ciatt001}" selectionMode="single" rows="10" 
    lazy="true" paginatorPosition="top" 
    paginatorTemplate="{RowsPerPageDropdown}{FirstPageLink}{PreviousPageLink} 
    {CurrentPageReport} {NextPageLink} {LastPageLink}" rowsPerPageTemplate="5,10,15" 
    emptyMessage="No existen clientes"> 

       <f:facet name="header" > 
        <p:outputPanel> 
         <h:outputText value="Busqueda " /> 
         <p:inputText id="globalFilter" onkeyup="clienteTable.filter()" 
         style="width:150px" size="10"/> 
        </p:outputPanel> 
       </f:facet> 

       <p:column id="numOrdenColumn" filterBy="#{tablaClientes.clDocid}" 
          width="50"    
          headerText="Identificación" 

          filterMatchMode="contains"> 
        <h:outputText value="#{tablaClientes.clDocid}" /> 
       </p:column> 
       <p:column id="nomCliColumn" 
          filterBy="#{tablaClientes.clNombre1}" 
          width="250" 

          headerText="Cliente" 
          filterMatchMode="contains"> 
        <h:outputText value="#{tablaClientes.clNombre1}" /> 
       </p:column> 

      </p:dataTable> 

MY托管Bean:

public LazyDataModel<Ciatt001> getAllClientes() { 
    if (listaClientesLazy == null) { 
     listaClientesLazy = new LazyClienteModel(ambiente.getCodCia(),ambiente.getCodAge()); 
     //listaClientesLazy = new LazyClienteModelMBean(); 
    } 

    return listaClientesLazy; 
} 

我LazyDataModel

public List<Ciatt001> load(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder, Map<String, String> filters) { 
    String a = ""; 
    try { 
    listaClientes = new ArrayList<Ciatt001>(); 
    a = String.valueOf(agendamientoSession.countClientes2(cia, age)); 
    listaClientes = agendamientoSession.listaClientes2(cia, age, startingAt, maxPerPage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    if (getRowCount() <= 0) { 
     setRowCount(Integer.parseInt(a)); 
    } 
    setPageSize(maxPerPage); 
    return listaClientes; 
    } 

@Override 
public Object getRowKey(Ciatt001 ciatt001) { 
    return ciatt001.getClDocid(); 
} 

@Override 
public Ciatt001 getRowData(String docid) { 
    //Integer id = Integer.valueOf(idBandeja); 

    for (Ciatt001 ciatt001 : listaClientes) { 
     if (docid.equals(ciatt001.getClDocid())) { 
      return ciatt001; 
     } 
    } 

    return null; 
}  

和EJB方法:

public List<Ciatt001> listaClientes2(String cia, String age ,int startingAt, int maxPerPage) { 

    Query query = em.createNamedQuery("Ciatt001.listaClientesPorCiaPorAge2"); 
    query.setParameter(1, cia); 
    query.setParameter(2, age); 
    query.setFirstResult(startingAt); 
    query.setMaxResults(maxPerPage); 
    return query.getResultList(); 
} 
    public String countClientes2(String cia, String age) { 

    Query query = em.createNamedQuery("Ciatt001.countClientes2"); 
    query.setParameter(1, cia); 
    query.setParameter(2, age);  
    return query.getSingleResult().toString(); 
} 

如何使用这种懒加载实现我实现一个全球性的过滤器?

Apreciatte您的帮助,谢谢:d

回答

4

在负载functon,得到过滤器值(是否不为空)。

String filterValue = filters.get("globalFilter"); 

然后,如果你不使用任何其他过滤器,使用脱节进行查询(OR):

"select * from table where x = ? OR y = ?" //replace ? for globalFilter value 

如果使用的是其他领域,你应该做的:

//normal filters 
filtersCondition = "(x = ? AND y = ?)" //replace ? for filters values 
//global filters 
globalFilterCondition = "(x = globalFilter OR y = globalFilter)" //replace ? for globalFilter value 
//normal filters + global filter 
query = "select * from table where " +filtersCondition+ " AND "+ globalFilterCondition 

当然,这个查询只是一个例子,你应该建立一个很好的一个,并参数化好=)

+0

嗨感谢回答,即时通讯使用最新版本3.3.1,是的ciatt001实现可串行化接口,是的调试全局过滤器触发负载方法。我只需要知道如何用这段代码来实现过滤器,或者我需要以另一种方式写它:D – arkantos

+0

好的,回答更新 –

+0

感谢您的帮助!,现在数据表工作得很好,起初我认为这是可以在没有使用条件的情况下完成,但是如果没有延迟实现的情况下加载的话,似乎无法加载。我会再次分享完整的代码,再次感谢。 – arkantos

1

这我如何得到它的工作,分页和过滤:d

的LazyDataModel现在这个样子:

 Set set = filters.entrySet(); 
     Iterator i = set.iterator(); 
     if (i.hasNext()) { 
      Map.Entry me = (Map.Entry) i.next(); 
      filterValue = (String) me.getValue(); 
     } 
     a = String.valueOf(agendamientoSession.countClientes2(cia, age, filterValue)); 
     listaClientes = agendamientoSession.listaClientes2(cia, age, startingAt, maxPerPage, filterValue); 
     setRowCount(Integer.parseInt(a)); 

的EJB:

负载方法

public List<Ciatt001> listaClientes2(String cia, String age ,int startingAt, int maxPerPage,String filtro)  { 
    Query query = em.createNamedQuery("Ciatt001.listaClientesPorCiaPorAge2"); 
    query.setParameter(1, cia); 
    query.setParameter(2, age); 
    query.setParameter(3,"%"+filtro+"%"); 
    query.setParameter(4,"%"+filtro+"%"); 
    query.setFirstResult(startingAt); 
    query.setMaxResults(maxPerPage); 
    } 

和我的查询:

select * from ciatt001 c where c.cl_co_cia=? and c.cl_ag_agencia =? 
    and c.cl_estado='A' and (c.cl_docid like ? or c.cl_nombre1 like ? .. more filters if needed) 

多数民众赞成在所有, 现在将寻找排序实施:D