使用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;(...)
}

而已。 请享用。

参考: Primefaces DataTable使用我们的JCG合作伙伴 Leonardo Shikida的@ViewScoped 通过JPA Criteria进行分页,筛选和排序的延迟加载,在Leo的Notepad博客上。

翻译自: https://www.javacodegeeks.com/2014/01/primefaces-datatable-lazy-loading-with-pagination-filtering-and-sorting-using-jpa-criteria-viewscoped.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql text字段导出_Mysql数据库的各种命令:

一、连接MYSQL格式&#xff1a; mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。 首先打开DOS窗口&#xff0c;然后进入目录mysqlbin&#xff0c;再键入命令mysql -u root -p&#xff0c;回车后提示你输密码. 注意用户名前可以有空格也可以没有空格&#xff0c;…

微信浏览器返回刷新,监听微信浏览器返回事件,网页防复制,移动端禁止图片长按和vivo手机点击img标签放大图片

以下代码都经过iphone7&#xff0c;华为MT7 &#xff0c;谷歌浏览器&#xff0c;微信开发者工具&#xff0c;PC端微信验证。如有bug&#xff0c;还请在评论区留言。 demo链接&#xff1a;https://pan.baidu.com/s/1c35mbjM 密码&#xff1a;5yyf 1.移动端微信浏览器返回刷新…

access数据库为什么一直登陆_为什么要养成用Access数据库保存数据的习惯?

我是宇哥&#xff0c;专门教数据库的&#xff0c;学办公软件的女同学没有不认识我的。一、今天强调一下&#xff1a;为什么要养成用标准数据库保存数据的习惯&#xff5e;其实制造业企业&#xff0c;都更倾向于用Access数据库保存日常数据&#xff0c;尤其是一些高端制造业&…

服务器主板北桥芯片组有哪些,主板芯片组_目前的主板芯片组都有哪些?

目前主流的芯片组有&#xff1a;Intel(英特尔)的、、、。AMD(超微)的、、、。nVidia的、、。芯片组就相当于主板的大脑&#xff0c;主板是什么芯片组决定了主板可以装什么处理器。因为主板芯片分为北桥芯片(离处理器近的)与南桥芯片(离处理器远的)&#xff0c;它们一般是成对出…

快速安装puppeteer (跳过安装Chromium)

npm i --save puppeteer --ignore-scripts 设置镜像下载 npm config set PUPPETEER_DOWNLOAD_HOSThttps://npm.taobao.org/mirrors npm install --save puppeteer 转载于:https://www.cnblogs.com/jso0/p/10336205.html

python地板除与除法的区别_“地板除”还是“取整除”?地板除和天花板除floor division和ceil devision...

上一篇文章知识点太多&#xff0c;我需要一一查看理解。 在运算符 ➡ 算数运算符 ➡ 操作符 ➡ // 整除&#xff08;地板除&#xff09; 3//4 为什么叫地板除&#xff1f; 向下取整除&#xff0c;就是地板除 floor division 向上取整除&#xff0c;就是天花板除&#xff0c;cei…

运行,JUnit! 跑!!!

JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术&#xff0c;甚至没有读过一篇博客文章&#xff0c;更不用说一本书了。 也许这是一件好事&#xff0c;因为它们看起来足够简单且易于理解&#xff0c;因此我们无需任何手册即可立即使用它们&#xff0c;但这也意味着它…

css3图形绘制

以下几个例子主要是运用了css3中border、bordr-radius、transform、伪元素等属性来完成的&#xff0c;我们先了解下它们的基本原理。 border&#xff1a;简单的来说border语法主要包含&#xff08;border-width、border-style、border-color&#xff09;三个属性。 „ border-t…

vueh5调用摄像头拍照_潜望式拍照5G手机盘点:售价相差数千元 究竟怎么选?

【dogkeji-科技犬】最近很多网友询问科技犬&#xff0c;目前支持50X潜望式长焦手机都有哪些&#xff0c;可否进行相关手机的推荐&#xff0c;今天就应大家的需求来盘点一下&#xff0c;给各位网友一些参考。推荐一&#xff0c;三星 Galaxy S20 U三星Galaxy S20 5G系列不仅搭载了…

09 事件对象

上篇介绍完我们js的事件流的概念之后&#xff0c;相信大家对事件流也有所了解了。那么接下来我们看一下jquery的事件操作。 在说jquery的每个事件之前&#xff0c;我们先来看一下事件对象 事件对象 Event 对象代表事件的状态&#xff0c;比如事件在其中发生的元素、键盘按键的状…

使用Struts2,Hibernate和MySQL创建个人MusicManager Web应用程序的研讨会

概述&#xff1a; 在本研讨会教程中&#xff0c;我们将使用Struts 2&#xff0c;Hibernate和MySQL数据库开发一个个人音乐管理器应用程序。 该Web应用程序可用于将您的音乐收藏添加到数据库中。 我们将显示用于添加唱片的表格&#xff0c;并在下面显示所有音乐收藏。 通过单击“…

链表快速排序python_Python一行代码实现快速排序的方法

今天将单独为大家介绍一下快速排序&#xff01; 一、算法介绍 排序算法&#xff08;Sorting algorithm&#xff09;是计算机科学最古老、最基本的课题之一。要想成为合格的程序员&#xff0c;就必须理解和掌握各种排序算法。其中"快速排序"&#xff08;Quicksort&…

自定义滚动条样式

啥都不说先看图: 注: 只适合chrom,不适用IE和fireFox 下面展示代码: 1 <html lang"en">2 <head>3 <meta charset"UTF-8">4 <title>CSS3自定义滚动条-轩枫阁</title>5 <style>6 header7 {8 font-family: …

解决zsh下ls命令无高亮颜色问题

问题原因因为本人比较菜不清楚, 但总归瞎弄解决了, 做个记录 解决方法 进入用户目录下的.bashrc(~/.bashrc), 寻找ls相关配置找到后将相关配置复制到.zshrc(~/.zshrc)中如果找不到的话, 可以复制我找到的直接复制. if [ -x /usr/bin/dircolors ]; thentest -r ~/.dircolors &am…

[折半搜索][has] Jzoj P4250 路径

Description A国有n个城市&#xff0c;编号为1到n&#xff0c;任意两个城市之间有一条路。shlw闲得没事干想周游A国&#xff0c;及从城市1出发&#xff0c;经过且仅经过除城市1外的每个城市1次&#xff08;城市1两次&#xff09;&#xff0c;最后回到城市1。由于shlw很傻&#…

使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在

最近Reddit上的帖子提出了一个问题&#xff1a;“ 是否存在一种预定义的方法来检查变量值是否包含特定字符或整数&#xff1f; ”基于问题的标题也被以另一种方式问到&#xff0c;“一种检查变量是否包含诸如列表之类的数字的方法或快速方法&#xff0c;例如或&#xff08;x&am…

rust为什么显示不了国服_Rust编程语言初探

静态、强类型而又不带垃圾收集的编程语言领域内&#xff0c;很久没有新加入者参与竞争了&#xff0c;大概大部分开发者认为传统的C/C的思路已经不太适合新时代的编程需求&#xff0c;即便有Ken Tompson这样的大神参与设计的golang也采用了GC的思路来设计其新一代的语言&#xf…

wps表格粗线和细线区别_详解论文中的表格技术

今天我们主要学习的技能如下&#xff1a;• 怎样用word做论文要求的三线表• 三线表中辅助线的断开• 表格或者图片自动编号1. 先普及一下&#xff0c;论文中的三线表吧。三线表以其形式简洁、功能分明、阅读方便而在科技论文中被推荐使用。三线表通常只有3条线&#xff0c;即顶…

素材

svg: www.sfont.cn/svg/ehed7f 转载于:https://juejin.im/post/5b9b70a8e51d450e4b1bdd33

如何自定义CSS滚动条的样式?

欢迎大家前往腾讯云 社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表 本文会介绍CSS滚动条选择器&#xff0c;并在demo中展示如何在Webkit内核浏览器和IE浏览器中&#xff0c;自定义一个横向以及一个纵向的滚动条。 0.需求 有的时候我们不想使用浏览器默…