Filter 如何使用延迟加载在primefaces数据表中实现全局过滤器?

Filter 如何使用延迟加载在primefaces数据表中实现全局过滤器?,filter,primefaces,lazy-loading,global,Filter,Primefaces,Lazy Loading,Global,在本教程之后,我有一个lazyDataModel的实现 我的代码与本教程略有不同,如下所示: 视图: 我的托管Bean: public LazyDataModel<Ciatt001> getAllClientes() { if (listaClientesLazy == null) { listaClientesLazy = new LazyClienteModel(ambiente.getCodCia(),ambiente.getCodAge());

在本教程之后,我有一个lazyDataModel的实现

我的代码与本教程略有不同,如下所示:

视图:


我的托管Bean:

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

    return listaClientesLazy;
}
public LazyDataModel getAllClientes(){
if(listaClientesLazy==null){
listaClientesLazy=newlazyclientemodel(ambiente.getCodCia(),ambiente.getCodAge());
//listaClientesLazy=新的LazyClienteModelMBean();
}
返回listaClientesLazy;
}
我的懒惰模型

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;
}       
公共列表加载(int startingAt、int maxPerPage、字符串sortField、SortOrder SortOrder、映射过滤器){
字符串a=“”;
试试{
listaClientes=newarraylist();
a=String.valueOf(agendamientoSession.countclients2(cia,age));
listaClientes=agendamientoSession.listaClientes2(cia、年龄、起始时间、最大每页);
}捕获(例外e){
e、 printStackTrace();
}

如果(getRowCount()On load functon),则获取筛选器值(检查是否不为null)

然后,如果不使用任何其他筛选器,请使用析取(或)进行查询:

如果您使用的是其他字段,则应执行以下操作:

//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

当然,这个查询只是一个示例,您应该构建一个很好的查询,并且参数化良好=)

这就是我如何使用它的方法,分页和过滤: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);
    }
仅此而已,
现在,我将寻找排序实现:D

您好,谢谢您的回答,我使用的是最新版本3.3.1,是的,ciatt001实现了可序列化接口,是的,调试中,全局筛选器正在触发加载方法。我只需要一个关于如何使用此代码实现筛选器的线索,或者我需要以另一种方式编写它。谢谢:DThanks您的帮助!现在datatable工作得很好,起初我认为不使用where条件就可以完成,但如果没有lazyloading实现,则无法加载大的结果集。稍后我将分享完整的代码,再次感谢。Primefaces它有很好的文档记录,但没有(官方)关于lazy load+全局筛选器的参考。现在,有同样疑问的人可以在这里找到解决方案。我很乐意帮助=)
"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
       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));
    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)