Primefaces DataTable + JPA/Hibernate分页
问题描述:
如果我能以某种方式将这两个框架结合在一起,那将会非常酷。Primefaces DataTable + JPA/Hibernate分页
单击Primefaces Datatable上的next或prev按钮将触发查询,并使用JPA限制查询结果。
也许有了一些机制,primefaces组件也可以从另一个JPA select count查询中获取总页数?
有没有关于如何将这些工作的例子?
请分享你的经验。
谢谢!
答
您可以使用LazyDataModel。在此示例中,我使用BackBean和JpaController通过NetBeans支持 “创建从实体JSF CRUD页” 创建(BackBean必须@SessionScoped)
private LazyDataModel<Car> lazyModel;
private int pageSize = 5;
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageSize() {
return pageSize;
public void LoadData() {
lazyModel = new LazyDataModel<Car>() {
@Override
public List<Car> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
//Sorting and Filtering information are not used for demo purposes just random dummy data is returned
List<Car> result = new ArrayList<Car>();
try {
result = getJpaController().findCarEntities(pageSize, first);
} catch (Exception ex) {
JsfUtil.addErrorMessage(ex, search);
}
return result;
}
};
/**
* In a real application, this number should be resolved by a projection query
*/
lazyModel.setRowCount(getJpaController().getCarCount());
lazyModel.setPageSize(pageSize);
}
public LazyDataModel<Car> getLazyModel() {
return lazyModel;
}
我添加
lazyModel.setPageSize(pageSize);
怎么一回事,因为分工由0知道问题http://code.google.com/p/primefaces/issues/detail?id=1544
<p:dataTable var="item" value="#{controller.lazyModel}"
rows="#{controller.pageSize}" paginator="true"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="9,12,15"
page=""
lazy="true"
dynamic="true"
id="pnlResult"
>
+3
它也可以使用@ViewScoped。 – ChuongPham 2011-04-18 14:44:07
答
这是我的代码过滤器的一列(名称列)。
// @PostConstruct method(injection for ejb's happens after constructor)
contactsEJB.getEntityManager().getEntityManagerFactory().getCache().evictAll(); //Clear the cache(get fresh data)
lazyModel = new LazyDataModel<Contacts>() {
@Override
public List<Contacts> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filter) {
List<Contacts> list = new ArrayList<Contacts>();
if (!filter.isEmpty()) {
Iterator it = filter.entrySet().iterator();
it.hasNext(); //this needs to be a while loop to handle multiple filter columns
Map.Entry pairs = (Map.Entry) it.next();
list = contactsEJB.findNameLike(pairs.getValue().toString(), first, pageSize);
getLazyModel().setRowCount(list.size());
} else {
list = contactsEJB.findRangeOrder(first, pageSize);
getLazyModel().setRowCount(contactsEJB.count());
}
return list;
}
};
getLazyModel().setRowCount(contactsEJB.count());
EJB
public List<Contacts> findRangeOrder(int start, int max) {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
Root<Contacts> root = cq.from(Contacts.class);
cq.select(root);
cq.orderBy(builder.desc(root.get(Contacts_.inserted)));
Query query = getEntityManager().createQuery(cq);
query.setMaxResults(max);
query.setFirstResult(start);
return query.getResultList();
}
public List<Contacts> findNameLike(String name, int start, int max) {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
Root<Contacts> root = cq.from(Contacts.class);
cq.select(root);
Predicate likeName = builder.like(root.get(Contacts_.name), "%"+name+"%");
cq.where(likeName);
Query query = getEntityManager().createQuery(cq);
query.setMaxResults(max);
query.setFirstResult(start);
return query.getResultList();
}
你尝试primeface的DataTable的延迟加载功能? – 2011-04-05 07:44:44