salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※
我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关实现。
现在很多的sfdc项目都是重构页面进行开发,所以很多系统分装的功能用不上,但是很多确实很常见的功能,比如分页,这时候就有必要自己封装一套翻页基类,子类继承父类并实现相关方法以后,前台通过封装的翻页类实现翻页功能。
根据系统的分页功能可以想象到我们设计的分页类应该满足以下简单的功能:
1.相关sObject的数据列表,用于显示数据;
2.首页,尾页;
3.上一页,下一页;
4.总页数,当前页数;
5.是否还有上一页,下一页;
6.每页显示条数(可动态显示)。
MyPagination类封装如下:
public virtual without sharing class MyPagination {
//默认值,如果不设置每页显示的数量,则默认数量为20
public static final Integer DEFAULT_PAGE_SIZE=20;
public MyPagination() {
}
public MyPagination(ApexPages.StandardController controller) {
}
public MyPagination(ApexPages.StandardSetController controller) {
}
//结果集
private List<sObject> sObjectList;
//查询条数的SQL
private String countStr;
//查询结果集的SQL
private String queryStr;
//查询结果集的条件 where 部分
private String queryCondition;
//查询结果集的group by部分
private String groupBy;
//查询结果集的order by 部分
private String orderBy;
//查询结果集的offset部分,offset最大值为2000,salesforce的限制
private Integer offset=0;
public List<sObject> resultList{
get {
if(sObjectList == null){
return new List<sObject>();
}
return sObjectList;
}
set;
}
public virtual void setQueryCondition(String countStr,String queryStr){
setQueryCondition(countStr,queryStr,null,null,null);
}
public virtual void setQueryCondition(String countStr,String queryStr,String queryCondition){
setQueryCondition(countStr,queryStr,queryCondition,null,null);
}
public virtual void setQueryCondition(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
this.countStr=countStr;
this.queryStr=queryStr;
this.queryCondition=queryCondition;
this.groupBy=groupBy;
this.orderBy=orderBy;
buildQuery();
}
private void buildQuery(){
List<String> queryArgs = new List<String>();
List<String> countArgs= new List<String>();
if(String.isNotBlank(countStr)){
countArgs.add(countStr);
}
if(String.isNotBlank(queryStr)){
queryArgs.add(queryStr);
}
if(String.isNotBlank(queryCondition)){
queryArgs.add(queryCondition);
countArgs.add(queryCondition);
}
if(String.isNotBlank(groupBy)){
queryArgs.add(groupBy);
countArgs.add(groupBy);
}
if(String.isNotBlank(orderBy)){
queryArgs.add(orderBy);
}
initTotalNum(countArgs);
queryStr=String.join(queryArgs,' ');
offset=0;
}
private void initTotalNum(List<String> countArgs){
String countqueryStr=String.join(countArgs,' ');
if(String.isNotBlank(countqueryStr)){
totalNumber=Database.countquery(countqueryStr);
} else {
totalNumber=0;
}
if(totalNumber != null) {
pageNumber=1;
}
}
public virtual List<sObject> getQueryResult(){
if(String.isBlank(queryStr)){
sObjectList = new List<sObject>();
}else{
String querySql=queryStr+' limit '+pageSize+' offset '+offset;
sObjectList = Database.query(querySql);
}
return sObjectList;
}
public virtual Integer getCountResult(){
return totalNumber;
}
//改变每页显示的数量
public virtual void changePageSize(Integer pageSize) {
if (pageSize!=null){
this.pageSize=pageSize;
}
}
//是否有下一页
public Boolean hasNext {
get {
return pageSize*pageNumber<totalNumber;
}
set;
}
//是否有前一页
public Boolean hasPrevious {
get {
return pageSize*(pageNumber-1)>0;
}
set;
}
public Integer pageNumber {
get {
if(pageNumber==null){
pageNumber=0;
}
return pageNumber;
}
set;
}
//每页显示页数
public Integer pageSize{
get{
if(pageSize==null){
pageSize=DEFAULT_PAGE_SIZE;
}
return pageSize;
}
set;
}
//结果集总数
public Integer totalNumber{
get{
if(totalNumber==null){
totalNumber=0;
}
return totalNumber;
}
set;
}
//总页数
public Integer totalPage{
get{
if(totalNumber==0 || math.mod(totalNumber,pageSize)!=0){
return totalNumber/pageSize+1;
}else{
return totalNumber/pageSize;
}
}
set;
}
//是否有记录集
public Boolean hasRecord{
get {
if(totalNumber!=0){
return true;
}else{
return false;
}
}
set;
}
//首页
public virtual void first() {
offset=0;
pageNumber=1;
}
//尾页
public virtual void last() {
offset=(totalPage-1)*pageSize;
pageNumber=totalPage;
}
//上一页
public virtual void previous() {
pageNumber--;
if(pageNumber<0){
pageNumber=0;
offset=0;
}else{
offset=(pageNumber-1)*pageSize;
}
}
//下一页
public virtual void next() {
pageNumber++;
if(pageNumber>totalPage){
pageNumber=totalPage;
}
offset=(pageNumber-1)*pageSize;
}
//指定页
public virtual void specifiedPage(Integer pageNumber) {
this.pageNumber = pageNumber;
if(pageNumber < 0) {
pageNumber = 0;
offset = 0;
} else {
offset = (pageNumber - 1) * pageSize;
}
}
//获取偏移量
public virtual Integer getOffset(){
return offset;
}
//获取每页显示条数
public virtual Integer getSize(){
return pageSize;
}
}
MyPaginationEnhance类:
public without sharing class MyPaginationEnhancement{
public static final Integer DEFAULT_PAGE_SIZE=20;
public MyPaginationEnhancement() {
}
public MyPaginationEnhancement(ApexPages.StandardSetController controller) {
}
public MyPaginationEnhancement(ApexPages.StandardController controller) {
}
private List<sObject> sObjectList;
private String countStr;
private String queryStr;
private String queryCondition;
private String groupBy;
private String orderBy;
private Integer offset=0;
public List<sObject> resultList{
get {
if(sObjectList == null){
return new List<sObject>();
}
return sObjectList;
}
set;
}
public List<sObject> getQueryResult(String countStr,String queryStr,String queryCondition){
setQueryCondition(countStr,queryStr,queryCondition,null,null);
buildAndQuery();
return sObjectList;
}
public List<sObject> getQueryResult(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
setQueryCondition(countStr,queryStr,queryCondition,groupBy,orderBy);
buildAndQuery();
return sObjectList;
}
public List<sObject> updateQueryResult(String queryStr,String queryCondition,String groupBy,String orderBy){
String querySql = queryStr;
if(queryCondition!=null){
querySql += queryCondition;
}
if(groupBy!=null){
querySql +=groupBy;
}
if(orderBy!=null){
querySql +=orderBy;
}
sObjectList = Database.query(querySql);
return sObjectList;
}
private void setQueryCondition(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
this.countStr=countStr;
this.queryStr=queryStr;
this.queryCondition=queryCondition;
this.groupBy=groupBy;
this.orderBy=orderBy;
}
private void buildAndQuery(){
List<String> queryArgs = new List<String>();
List<String> countArgs= new List<String>();
if(String.isNotBlank(countStr)){
countArgs.add(countStr);
}
if(String.isNotBlank(queryStr)){
queryArgs.add(queryStr);
}
if(String.isNotBlank(queryCondition)){
queryArgs.add(queryCondition);
countArgs.add(queryCondition);
}
if(String.isNotBlank(groupBy)){
queryArgs.add(groupBy);
countArgs.add(groupBy);
}
if(String.isNotBlank(orderBy)){
queryArgs.add(orderBy);
}
initTotalNum(countArgs);
queryResult(queryArgs);
}
private void initTotalNum(List<String> countArgs){
String countqueryStr=String.join(countArgs,' ');
if(String.isNotBlank(countqueryStr)){
totalNumber=Database.countquery(countqueryStr);
} else {
totalNumber=0;
}
if(totalNumber !=0 && pageNumber==0){
pageNumber = 1;
}
}
private List<sObject> queryResult(List<String> queryArgs){
queryStr=String.join(queryArgs,' ');
if(String.isBlank(queryStr)){
sObjectList = new List<sObject>();
}else{
String querySql=queryStr+' limit '+pageSize+' offset '+offset;
sObjectList = Database.query(querySql);
}
return sObjectList;
}
public void changePageSize(Integer pageSize) {
if (pageSize!=null){
this.pageSize=pageSize;
}
}
public Boolean hasNext {
get {
return pageSize*pageNumber<totalNumber;
}
set;
}
public Boolean hasPrevious {
get {
return pageSize*(pageNumber-1)>0;
}
set;
}
public Integer pageNumber {
get {
if(pageNumber==null){
pageNumber=0;
}
return pageNumber;
}
set;
}
public Integer pageSize{
get{
if(pageSize==null){
pageSize=DEFAULT_PAGE_SIZE;
}
return pageSize;
}
set;
}
public Integer totalNumber{
get{
if(totalNumber==null){
totalNumber=0;
}
return totalNumber;
}
set;
}
public Integer totalPage{
get{
if(totalNumber==0 || math.mod(totalNumber,pageSize)!=0){
return totalNumber/pageSize+1;
}else{
return totalNumber/pageSize;
}
}
set;
}
public Boolean hasRecord{
get {
if(totalNumber!=0){
return true;
}else{
return false;
}
}
set;
}
public void first() {
offset=0;
pageNumber=1;
}
public void last() {
offset=(totalPage-1)*pageSize;
pageNumber=totalPage;
}
public void previous() {
pageNumber--;
if(pageNumber<0){
pageNumber=0;
offset=0;
}else{
offset=(pageNumber-1)*pageSize;
}
}
public void next() {
pageNumber++;
if(pageNumber>totalPage){
pageNumber=totalPage;
}
offset=(pageNumber-1)*pageSize;
}
//指定页
public virtual void specifiedPage(Integer pageNumber) {
this.pageNumber = pageNumber;
if(pageNumber < 0) {
pageNumber = 0;
offset = 0;
} else {
offset = (pageNumber - 1) * pageSize;
}
}
public Integer getOffset(){
return offset;
}
public Integer getSize(){
return pageSize;
}
}
MyPaginationEnhancement
部分变量解释:
1.sObjectList:封装SOQL查询出来的sObject的结果集;
2.countStr:SOQL查询条数的SQL语句;
3.queryStr:SOQL查询结果集的SQL语句;
4.queryCondition:SOQL中查询结果集条件部分语句(where xxx);
5.groupBy:如果SOQL需要用到分组或者聚合函数等,则设置此变量group by语句;
6.orderBy:如果SOQL需要按照某个或者某些字段进行升序或者降序排列,则设置此变量order by语句;
7.offset:偏移量,SOQL中对于偏移量最大设置的值为2000,超过2000则抛出异常;
8.hasNext:数据当前页是否还有下一页;
9.hasPrevious :数据当前页是否还有上一页;
10.pageNumber:当前页数;
11.pageSize:每页显示条数;
12.totalNumber:结果集总数;
13.totalPage:总页数;
14.hasRecord:结果集是否为空。
部分方法解释:
1.setQueryCondition:设置查询条件,通过子类的SQL查询条件拼装成需要执行的SQL,此方法有三种重构函数,涵盖了主要的SQL查询条件的用法,如果有其他需求,可以继续重构;
2.initTotalNum:获取结果集总数;
3.buildQuery:通过基础SQL以及query condition将其拼装成一个完整的SQL语句;
4.getQueryResult:通过拼装成完整的SQL语句进行查询,返回查询出来的结果列表;
5.changePageSize:改变每页显示的数据条数;
6.first:跳转到首页;
7.last:跳转到尾页;
8.previous:跳转到上一页;
9.next:跳转到下一页;
10.specifiedPage:跳转到指定页数。
总结:对于一般的分页功能,此基类基本封装,故项目要求没有特别高情况下可以直接使用此基类,有的人会说offset最大限制是2000,如果超过2000基类中没有处理会不会不好。这个觉得因设计而异,controller层使用pagination后,执行sql查询列表前应先查一下offset是否已经超过了2000,如果超过2000可以给前台抛出自定义友好的异常或者设置offset为2000,这样做法会比在基类中强制写死比较好。篇中如果有错误地方欢迎指正,如果有不懂地方欢迎留言。
salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※的更多相关文章
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce零基础学习(九十八)Type浅谈
在Salesforce的世界,凡事皆Metadata. 先通过一句经常使用的代码带入一下: Account accountItem = (Account)JSON.deserialize(accoun ...
- salesforce零基础学习(九十八)Salesforce Connect & External Object
本篇参考: https://trailhead.salesforce.com/en/content/learn/modules/lightning_connect https://help.sales ...
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- 支付宝支付-APP支付服务端详解
支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付分装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...
- 关于DOM对象与JQuery对象的那些事
这个问题源自上一次的工作室讨论班,主题是"jQuery选择器的使用",在讨论班的结尾,我留了一个思考题: jQuery获取到的对象和直接调用原生Javascript方法获得的对象 ...
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
先列出题目: 1.POJ 1753 POJ 1753 Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...
- Qt下的udp编程
项目需要一个基于udp的客户端, 看着Qt是有个QUdpSocket的类的, 但自带的例子和类的说明都没咋说明白: 怎么用一个QUdpSocket既当发送端, 又当接收端? 谷歌一顿后, 发现很多老内 ...
- bzoj 2563: 阿狸和桃子的游戏
开始写了一些东西但是后来浏览器挂了就没有存下来简直!!!!!!!!!!!!!QAQ 不想再写一遍了...总之是简单贪心. #include <iostream> #include < ...
- 【Python】引用计数
一.概述 要保持追踪内存中的对象,Python使用了引用计数这一简单的技术. 二.引用计数的增减 2.1 增加引用计数 当对象被创建并(将其引用)赋值给变量时,该对象的引用计数被设置为1. 对象的引用 ...
- vue-cli 组件的使用
开始项目之前,先了解如何创建项目: http://www.cnblogs.com/pearl07/p/6247389.html 1,项目目录结构(路由是后来建的,将在下一篇使用路由,此处可忽略). 2 ...
- swiper的初步使用
1.引入文件,顺序引入(此处基于jquery,且版本至少1.7以上) <link rel="stylesheet" href="path/to/swiper-3.4 ...
- .Net程序员之不学Java做安卓开发:Android Studio中的即时调试窗口
对学.Net的人来说,JAVA开发是一场噩梦. .net中的即时窗口,调试时直接在里面写代码,对程序中的各种方法/属性进行调用,很方便. Android Studio中找了好久,参考如下网址,也有类似 ...
- C++ 小知识积累
(1)setw和setfill函数 #include<iomanip> 代码: #include<iostream> #include<iomanip> using ...