2014-07-03 39 views
2

我有一個實施的延遲加載數據表與primefaces實現如何參數傳遞給Primefaces LazyDataModel負載功能

load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) 

現在我需要從我的頁面參數傳遞給此方法(即我有一個過濾器部分在我的頁面,過濾器不是表的一部分,並且是獨立的對象!)。我的參數存儲在頁面的託管bean中。

我該如何做到這一點?

謝謝!

回答

1

使參數(S)的Bean的屬性,並直接轉給從數據庫提取數據服務(在這個例子中,服務是EJB MyObjFacade myObjFacade):

@ManagedBean 
@ViewScoped 
public class MyBean { 
    @EJB 
    private MyObjFacade myObjFacade; 
    private LazyDataModel<MyObjType> model;  // getter 
    private MyParameter myParameter; 

    @PostConstruct 
    public void init() { 
     model = new LazyDataModel<MyObjType>() { 

      @Override 
      public List<MyObjType> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) { 
       model.setRowCount(myObjFacade.count(filters, myParameter)); 
       return myObjFacade.getResultList(first, pageSize, sortField, sortOrder, filters, myParameter); 
      } 
     }; 
     model.setRowCount(myObjFacade.count(new HashMap<String, String>())); 
    } 
} 

你只需提供執行countgetResultList方法的服務即可。

+0

我不能使用兩個diferente類嗎?如此處所述http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml。 – RMartins

+0

從理論上講,您應該可以使用不同的類,但處理一些事情會更困難:對於數據源注入,模型應該是EJB或視圖範圍的bean。嘗試一下,如有必要,在新的問題中發佈代碼。 – perissf

+0

這工作(我有點相同)。你甚至可以把它變成一個基類,並且很容易添加像'多租戶'這樣的基本事物 – Kukeltje

-1

經過很多小時的搜索,我終於做到了。我在這裏留下我的解決方案供進一步參考

//Managed Bean - View 
public class DummyLazySearchPageBean { 

    private LazyDataModel<DummyObject> results; 
    private String searchFilter;//to simulate search filter 
    private DummyBusinessClass dummyBusinessClass; 

    public DummyLazySearchPageBean() { 
     results = new SearchsLazyLoader(); 
    } 

    // GETTERS AND SETTERS 

    @SuppressWarnings("serial") 
    private final class SearchsLazyLoader extends LazyDataModel<DummyObject> { 
     @Override 
     public List<DummyObject> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) { 
//Simulate BD model   
List<DummyObject> data = new ArrayList<DummyObject>(); 
      dummyBusinessClass = new DummyBusinessClass(); 

      data = dummyBusinessClass.search(searchFilter, 5000); 

      //rowCount 
      this.setRowCount(data.size()); 

       //paginate 
       if(data.size() > pageSize) { 
        try { 
         return data.subList(first, first + pageSize); 
        } 
        catch(IndexOutOfBoundsException e) { 
         return data.subList(first, first + (data.size() % pageSize)); 
        } 
       } 
       else { 
        return data; 
       } 
     } 
    } 

    public final void search(){ 
     results = new SearchsLazyLoader(); 
    } 
} 
+0

缺少一些解釋(可能工作,但看起來不像原始答案) – Kukeltje

-1

只需使用參數輸入創建SearchsLazyLoader的構造函數。 這是我的代碼示例:

package com.mandiri.askes.model.lazy; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import org.apache.commons.lang3.StringUtils; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.primefaces.model.LazyDataModel; 
import org.primefaces.model.SortOrder; 

import com.mandiri.askes.model.Participant; 
import com.mandiri.askes.utils.CallAble; 
import com.mandiri.askes.utils.HibernateUtil; 

public class LazyPesertaDataModel extends LazyDataModel<Participant> { 
    private static final long serialVersionUID = 1L; 
    private String keyword; 

    public LazyPesertaDataModel(String keyword) { 
     if (StringUtils.isNotEmpty(keyword)) { 
      this.keyword = keyword; 
     }else{ 
      this.keyword = ""; 
     }  
    } 

    /** 
    * Collect Peserta Badan Usaha as Data Model Primefaces 
    * 
    */ 
    @Override 
    public List<Participant> load(int first, int pageSize, String sortField, 
      SortOrder sortOrder, Map<String, String> filters) { 

     List<Participant> listPesertaBpjs = new ArrayList<Participant>(); 

     listPesertaBpjs = getLazyDataPeserta(first, pageSize, sortField); 

     this.setRowCount(countAllRecord()); 

     return listPesertaBpjs; 
    } 

    /** 
    * Get Peserta Data using hibernate pagination <b>(Lazy Loading)</b> Technique. 
    * 
    * @author Dibrut 
    * @param firstRecord 
    * @param maxResult 
    * @return 
    */ 
    @SuppressWarnings("unchecked") 
    public List<Participant> getLazyDataPeserta(final int firstRecord, final int maxResult, final String sortField) { 
     return HibernateUtil.doInTransaction(new CallAble<List<Participant>>() { 

      @Override 
      public List<Participant> call(Session session) throws Exception { 

       List<Participant> pesertaList = new ArrayList<Participant>(); 
       String hql = "FROM com.dibrut.learn.model.Participant P" 
         + " WHERE P.name LIKE :keyword"; 

       Query query = session.createQuery(hql).setFirstResult(firstRecord). 
         setMaxResults(maxResult).setString("keyword", "%"+keyword+"%"); 

       pesertaList = query.list(); 
       return pesertaList; 
      } 
     });  
    } 

    /** 
    * Count total participant 
    * @return 
    * @author Dibrut 
    */ 
    public int countAllRecord(){ 
     return HibernateUtil.doInTransaction(new CallAble<Integer>() { 

      @Override 
      public Integer call(Session session) throws Exception {    
       String hql = "FROM com.dibrut.learn.model.Participant P" 
         + " WHERE P.name LIKE :keyword"; 

       Long totalPesertaBu = (Long) session.createQuery(hql).      
         setString("keyword", "%"+ keyword+"%"). 
         uniqueResult(); 

       return totalPesertaBu.intValue(); 
      } 
     });  
    } 

    public String getKeyword() { 
     return keyword; 
    } 

    public void setKeyword(String keyword) { 
     this.keyword = keyword; 
    } 

} 
如果你要搜索的數據,只需要調用構造函數與managedBean屬性的參數

。例如,您的ManagedBean中有searchParticipant方法:

public void searchParticipant() { 
    this.participantLazyModel = new LazyPesertaDataModel(this.keyword);  
} 

其中關鍵字是來自頁面的inputText的值。

+0

工作,但其他答案是更符合我的所作所爲,看起來'更簡單' – Kukeltje