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设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- POJ No.2386【B007】
[B007]Lake Counting[难度B]—————————————————————————————————————————— [Description] Due to recent rains ...
- Spring MVC MultipartFile实现图片上传
<!--Spring MVC xml 中配置 --><!-- defaultEncoding 默认编码;maxUploadSize 限制大小--><!-- 配置Multi ...
- Oracle 查询出来的数据取第一条
Oracle 查询出来的数据取第一条 --------------------------------------------------------------------------- 转载自:h ...
- 前端CSS规范整理_转载、、、
一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...
- 疑难问题解决备忘录(1)——LAMP环境下WordPress无法发现themes目录下的主题问题解决
程序猿的宿命就是无穷无尽地解题,虽然可以说是解题的机器,但也无法达到解题之神的境界,碰到自己解决不了的问题那是家常便饭,尤其当遍寻Google和StackOverflow花了九牛二虎之力才解决的问题, ...
- OpenCV(三) 之 基本数据结构 CvMat和 IplImage
OpenCV(三) 之 基本数据结构 CvMat和 IplImage CvMat IplImage OpenCv中基本的数据类型 类型 参数 表示 CvPoint int x,y 像素点 CvPoin ...
- BZOJ1129 : [POI2008]Per
枚举LCP,假设前$i-1$个都相同.那么后面$n-i$个数可以随意排列,第$i$个位置可以填的方案数为后面小于$a_i$的数字个数,树状数组维护. 同时为了保证本质不同,方案数需要除以每个数字的个数 ...
- Windows Commands and API
Shortcuts ... Symbolic Links https://en.wikipedia.org/wiki/NTFS_symbolic_link Hard Links https://en. ...
- tungsten抽取和应用mysql binlog
首先举例说明 api的基本使用方式 首先进行配置 , 可以看到源数据库和目的数据库 TungstenProperties tp=new TungstenProperties(); tp.setStri ...
- 用百度webuploader分片上传大文件
一般在做文件上传的时候,都是通过客户端把要上传的文件上传到服务器,此时上传的文件都在服务器内存,如果上传的是视频等大文件,那么服务器内存就很紧张,而且一般我们都是用flash或者html5做异步上传, ...