使用JPA标准@ViewScoped通过分页,过滤和排序进行Primefaces DataTable延迟加载
生活随笔
收集整理的這篇文章主要介紹了
使用JPA标准@ViewScoped通过分页,过滤和排序进行Primefaces DataTable延迟加载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Primefaces數據表惰性分頁有效,但是在Web上使用Criteria搜索完整示例后,我感到非常沮喪。 所以我混合了來自
- http://stackoverflow.com/questions/13972193/how-to-query-data-for-primefaces-datatable-with-lazy-loading-and-pagination
- http://www.primefaces.org/showcase/ui/datatableLazy.jsf
- http://www.javacodegeeks.com/2012/04/lazy-jsf-primefaces-datatable.html
使用以下命令將所有內容放到一個完整的示例中:
- Primefaces 4.0
- TomEE 1.6.0以上
- 標準JPA
帶有:
- 篩選
- 排序
- 分頁
- 使用@ViewScoped托管豆
讓我們開始吧:
xhtml片段
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:p="http://primefaces.org/ui"> <h:body><h:form id="am"><p:dataTablevar="element"value="#{inventoryManagerMB.model}"lazy="true"paginator="true"rows="10"paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"rowsPerPageTemplate="10,50,100"id="sites"><p:column sortBy="id" filterBy="id" filterMatchMode="contains" headerText="ID"> <h:outputText value="#{element.id}" /></p:column><p:column sortBy="name" filterBy="name" filterMatchMode="contains" headerText="Name"> <h:outputText value="#{element.name}" /></p:column><p:column sortBy="siteType.name" filterBy="siteType.name" filterMatchMode="contains" headerText="Type"> <h:outputText value="#{element.siteType.name}" /></p:column><p:column sortBy="ip" filterBy="ip" filterMatchMode="contains" headerText="IP"> <h:outputText value="#{element.ip} " /></p:column><p:column sortBy="description" filterBy="description" filterMatchMode="contains" headerText="Description"> <h:outputText value="#{element.description}" /></p:column></p:dataTable></h:form> </h:body> </html>ManagedBean
@ManagedBean @ViewScoped public class InventoryManagerMB implements Serializable {private static final long serialVersionUID = -1201944101993687165L;@EJBprivate InventoryManagerEJB inventoryManagerEJB;private LazyDataModel<Site> model;@PostConstructpublic void init() {try {this.model = new LazyDataModel<Site>(){private static final long serialVersionUID = 1L;@Overridepublic List<Site> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {List<Site> result = inventoryManagerEJB.getResultList(first, pageSize, sortField, sortOrder, filters);model.setRowCount(inventoryManagerEJB.count(sortField, sortOrder, filters));return result;}}; }public LazyDataModel<Site> getModel() {return model;}public void setModel(LazyDataModel<Site> model) {this.model = model;}(...)EJB
@Stateless public class InventoryManagerEJB {@Injectprivate BaseService baseService;public List<Site> getResultList(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {List<Site> all = new ArrayList<Site>();all.addAll(this.baseService.getSiteDAO().getAll(first,pageSize,sortField,sortOrder,filters));return all;}public int count(String sortField, SortOrder sortOrder, Map<String, String> filters) {return this.baseService.getSiteDAO().getAll(-1,-1,null,null,filters).size();} }基本服務
@ApplicationScoped public class BaseService implements Serializable{private static Logger log = Logger.getLogger(BaseService.class);/** persistence*/private static final long serialVersionUID = 588696475267901772L;@PersistenceContextprivate EntityManager entityManager;private SiteDAO siteDAO;@PostConstructpublic void init() {siteDAO = new SiteDAO(entityManager);}public SiteDAO getSiteDAO() {return siteDAO;}SiteDAO
public class SiteDAO extends GenericDAO<Site>{public SiteDAO(EntityManager entityManager) {super(entityManager);}public Collection<Site> getAll(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {CriteriaBuilder cb = entityManager.getCriteriaBuilder();CriteriaQuery<Site> q = cb.createQuery(Site.class);Root<Site> site = q.from(Site.class);Join<Site,SiteType> siteType = site.join(Site_.siteType);q.select(site);Path<?> path = getPath(sortField, site, siteType);if (sortOrder == null){//just don't sort}else if (sortOrder.equals(SortOrder.ASCENDING)){q.orderBy(cb.asc(path));}else if (sortOrder.equals(SortOrder.DESCENDING)){q.orderBy(cb.asc(path));}else if (sortOrder.equals(SortOrder.UNSORTED)){//just don't sort}else{//just don't sort}//filterPredicate filterCondition = cb.conjunction();for (Map.Entry<String, String> filter : filters.entrySet()) {if (!filter.getValue().equals("")) {//try as string using likePath<String> pathFilter = getStringPath(filter.getKey(), site, siteType);if (pathFilter != null){filterCondition = cb.and(filterCondition, cb.like(pathFilter, "%"+filter.getValue()+"%"));}else{//try as non-string using equalPath<?> pathFilterNonString = getPath(filter.getKey(), site, siteType);filterCondition = cb.and(filterCondition, cb.equal(pathFilterNonString, filter.getValue()));}}}q.where(filterCondition);//paginationTypedQuery<Site> tq = entityManager.createQuery(q);if (pageSize >= 0){tq.setMaxResults(pageSize);}if (first >= 0){tq.setFirstResult(first);}return tq.getResultList();}private Path<?> getPath(String field, Root<Site> site, Join<Site, SiteType> siteType) {//sortPath<?> path = null;if (field == null){path = site.get(Site_.name);}else{switch(field){case "id":path = site.get(Site_.id);break;case "name":path = site.get(Site_.name);break;case "siteType.name":path = siteType.get(SiteType_.name);break;case "ip":path = site.get(Site_.ip);break;case "description":path = site.get(Site_.description);break;}}return path;}private Path<String> getStringPath(String field, Root<Site> site, Join<Site, SiteType> siteType) {//sortPath<String> path = null;if (field == null){path = site.get(Site_.name);}else{switch(field){case "id":path = null;break;case "name":path = site.get(Site_.name);break;case "siteType.name":path = siteType.get(SiteType_.name);break;case "ip":path = site.get(Site_.ip);break;case "description":path = site.get(Site_.description);break;}}return path;} }實體
@Entity @Table(uniqueConstraints=@UniqueConstraint(columnNames={"name"})) public class Site implements Serializable {/****/private static final long serialVersionUID = 8008732613898597654L;@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;@Nameable@Column(nullable=false)private String name;private String ip; private String description;@ManyToOne@JoinColumn(name="siteTypeId")private SiteType siteType;(...) } 而已。 請享用。
翻譯自: https://www.javacodegeeks.com/2014/01/primefaces-datatable-lazy-loading-with-pagination-filtering-and-sorting-using-jpa-criteria-viewscoped.html
總結
以上是生活随笔為你收集整理的使用JPA标准@ViewScoped通过分页,过滤和排序进行Primefaces DataTable延迟加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用路由器禁止迅雷路由器如何设置禁止迅
- 下一篇: 广电网络的无线路由器如何设置拨号上网广电