同じモデルとコントローラーを使用する 3 つのテスト Web アプリケーションがありますが、違いは JSF セッション マネージド Bean にあります。
アプリケーションAとCは、 JSF DataModelを使用してアイテムを取得します。JPA クエリの結果セットは、ListDataModel にラップされる Java LIST を返します。この後者の値は、PrimeFaces dataTableによって表示される項目です。
アプリケーションBは、Java LISTを使用して項目を取得します。JPA Query の結果セットは、PrimeFaces 2.2.1 dataTable によって表示される項目の値である Java List を返します。
アプリケーション B の並べ替えとフィルタリングは完全に機能し、高速ですが、アプリケーション A と C では致命的ではありません。
Richfaces、OpenFaces などの他のライブラリの並べ替えでのフィルタリングは、この同じコードを使用してすぐに機能することを述べておきたいと思います。
問題は PrimeFaces 3.0.0 にも残っています。これはバグですか?
- アプリ B で:
コード:
private List<Customer> items = null;
// remainder of code here
public List<Customer> getCustomerItems() {
if (customerItems == null) {
getPagingInfo();
customerItems = jpaController.findCustomerEntities(pagingInfo.getBatchSize(), pagingInfo.getFirstItem());
}
return customerItems;
}
アプリ A:
コード:
private DataModel items = null;
public PaginationHelper getPagination() {
if (pagination == null) {
pagination = new PaginationHelper(999999) {
@Override
public int getItemsCount() {
return getJpaController().getChimioCount();
}
@Override // The list of Customers is wrapped in a JSF ListDataModel
public DataModel createPageDataModel() {
return new ListDataModel(getJpaController().findCustomerEntities(getPageSize(), getPageFirstItem()));
}
};
}
return pagination;
}
/**
* this goes for the value attribute in a datatable to list all the Customer items
*/
public DataModel getItems() {
if (items == null) {
items = getPagination().createPageDataModel();
}
return items;
}
アプリ C:
コード:
private DataModel<Project> items;
// remainder of code here
/**
*The ListDataModel is initialized here
*/
public void init() {
try {
setProjectList(doInTransaction(new PersistenceAction<List<Project>>() {
public List<Project> execute(EntityManager em) {
Query query = em.createNamedQuery("project.getAll");
return (List<Project>) query.getResultList();
}
}));
} catch (ManagerException ex) {
Logger.getLogger(ProjectManager.class.getName()).log(Level.SEVERE, null, ex);
}
projectItems = new LinkedList<SelectItem>();
projectItems.add(new SelectItem(new Project(), "-- Select one project --"));
if (getProjectList() != null) {
projects = new ListDataModel<Project>(getProjectList());
for (Project p : getProjectList()) {
projectItems.add(new SelectItem(p, p.getName()));
}
}
}
よろしくお願いいたします。