2

このチュートリアルhttp://uaihebert.com/?p=1120に従ってlazyDataModelの実装があります

私のコードはこのチュートリアルとは少し異なります。ここにあります:

意見:

<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();
}

この遅延読み込みの実装を使用してグローバルフィルターを実現するにはどうすればよいですか?

4

2 に答える 2

5

ロード機能で、フィルター値を取得します(nullでないかどうかを確認します)。

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

もちろん、このクエリは単なる例です。適切なクエリを作成し、適切にパラメータ化する必要があります=)

于 2012-06-28T00:37:05.003 に答える
1

これは私がそれを機能させる方法、ページ付けとフィルタリング:D

LazyDataModelは次のようになります。

loadメソッドの場合:

       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

于 2012-06-28T22:50:58.337 に答える