博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc+jpa实现分页的两种方式
阅读量:6325 次
发布时间:2019-06-22

本文共 5951 字,大约阅读时间需要 19 分钟。

v1.工具类

public final class QueryTool {    public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType){        Sort sort = null;        if("auto".equals(sortType)) {            sort = new Sort(Direction.DESC, "ctime");        } else {            sort = new Sort(Direction.DESC, "ctime");        }                return new PageRequest(pageNumber, pageSize, sort);    }        public static 
Specification
buildSpecification(Map
searchParams, Class
domainClass){ Map
filters = SearchFilter.parse(searchParams); Specification
spec = DynamicSpecifications.bySearchFilter(filters.values(), domainClass); return spec; }}

v2.Service类(只给出CommentService)

@Servicepublic class CommentService {    @Autowired    private CommentDao commentDao;        @Transactional    public void addComment(Comment comment) {        if(comment == null) return;        commentDao.save(comment);    }        @Transactional    public Page
findAllComments(String problemId, PageRequest pageable){ Page
page = commentDao.findAllCommentsByProblemId(problemId, pageable); return page; }}

v3.repository类(problem 和 comment 属于 一对多 的关系)

@Repositorypublic interface CommentDao extends JpaSpecificationExecutor
, PagingAndSortingRepository
{ @Query("select c from Comment c where c.problem.problemid = ?1") public Page
findAllCommentsByProblemId(String problemId, Pageable pageable);}

v 4.Controller类

  第一种方式

@Controllerpublic class ProblemController {        @Autowired    private ProblemService problemService;        @Autowired    private CommentService commentService;        @RequestMapping(value="getCurProblemComments")    @ResponseBody    public String getCurProblemComments(String problemName, @RequestParam(value = "pn", defaultValue = "1") int pageNumber,            @RequestParam(value = "ps", defaultValue = "4") int pageSize,            @RequestParam(value = "sortType", defaultValue = "auto") String sortType){        JSONObject jsono = new JSONObject();        try {            Problem problem = problemService.getProblemByName(problemName);            if(problem == null){                problem = problemService.addProblem(problemName);            }            PageRequest pageRequest = QueryTool.buildPageRequest(pageNumber, pageSize, sortType);            //根据题目的id获取所有的评论            Page
page = commentService.findAllComments(problem.getProblemid(), pageRequest); //对 Comment 这个类中的一些字段进行过滤 SimplePropertyPreFilter spp = new SimplePropertyPreFilter(); spp.getExcludes().addAll(Comment.getExcludeString()); jsono.put("success", true); jsono.put("message", JSON.toJSONString(page, spp)); } catch(Exception e){ e.printStackTrace(); jsono.put("success", false); jsono.put("message", "inner error."); } return jsono.toString(); }}

  

  第二种方式,(懒了,有些内容是放在servic中的。)

  通过JpaSpecificationExecutor<T> 的Page<T> findAll(Specification<T> spec, Pageable pageable); 方法(按照指定的规格条件)实现分页查询。

public String getCurProblemComments(@RequestParam(value = "pn", defaultValue = "1") int pageNumber,        @RequestParam(value = "ps", defaultValue = "2") int pageSize,        @RequestParam(value = "sortType", defaultValue = "auto") String sortType, ServletRequest request) {    Map
searchParams = new HashMap
(); searchParams = Servlets.getParametersStartingWith(request, "search_"); System.out.println(EncodeUtils.toUTF8((String)searchParams.get("LIKE_name"))); PageRequest pageRequest = QueryTool.buildPageRequest(pageNumber, pageSize, sortType); searchParams.put(Operator.EQ + "_dr", "0");//逻辑删除中,字段dr=0表示这条数据没有删除 Specification
spec = QueryTool.buildSpecification(searchParams, Comment.class); Page
page = commentDao.findAll(spec, pageRequest); return JSON.toJSONString(page);}

  其中,Specification中的一些比较操作org.springside.modules.persistence.SearchFilter.Operator这个类中找到,如下:

public static enum Operator {   EQ, LIKE, GT, LT, GTE, LTE;}

  前台传递过来的参数名称中可以包含 Operator 中的一些操作, 比如参数名称是: search_LIKE_name (search表示要查询时比较, LIKE是比较的操作, name是表的字段名)

v5.java简单实现分页

 

分页面板类(MyPagePanel.java)

 
View Code

MyMessage.class

 
View Code

MyPage.class

 
View Code

  实现思路:

1. 首先看一下后台的json数据的格式(其中message的值是spring Data JPA分页查询结果的json)

{"success":true,"message":{"content":[{"ccontent":"hjz 2016-38-11 15:38:21*****宋体|12|0-0-0| *****0$$$$$70#####","commentid":"8ae45d92549da2a801549ec092ce001f"},{"ccontent":"hjz 2016-38-11 15:38:10*****宋体|12|0-0-0|哇哇 *****2$$$$$55#####","commentid":"8ae45d92549da2a801549ec068c7001e"}],"first":true,"last":false,"number":0,"numberOfElements":2,"size":2,"sort":{},"totalElements":8,"totalPages":4}}

 

2. 将“message”对应的值转换成MyPage对象,因为MyPage中有一个List<MyMessage>,如果属性中含有复杂的类型,当其中属性有类似List , Map ,ArrayList、自定义的类型,如List<MyMessage> content, 普通的转换会报错:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX,在JSONObject.toBean的时候如果转换的类中有集合,可以先定义Map<String, Class> classMap = new HashMap<String, Class>();在classMap中put你要转换的类中的集合名 。本例中需要将“content”对应的值转换成 MyMessage对象。

//data为后台的json串JSONObject result = JSONObject.fromObject(data);if((Boolean) result.get("success")){
//分页显示 JSONObject message = JSONObject.fromObject(result.get("message")); Map
> classMap = new HashMap
>(); classMap.put("content", MyMessage.class); MyPage myPage = (MyPage) JSONObject.toBean(message, MyPage.class, classMap); this.updatePage(myPage);}

3.然后通过分页的信息,简单的实现分页按钮,详情看MyPagePanel.java

本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/5477523.html,如需转载请自行联系原作者
你可能感兴趣的文章
C#反射方法学习
查看>>
MD5加密解密
查看>>
.Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法
查看>>
SVN被锁定的几种解决方法
查看>>
js如何判断是否在iframe中及防止网页被别站用 iframe嵌套 (Load denied by X-Frame-Options)...
查看>>
ios ios7 取消控制拉升
查看>>
182在屏幕中实现网格化视图效果
查看>>
本文摘录 - FlumeJava
查看>>
Scala学习(三)----数组相关操作
查看>>
Matlab基于学习------------------函数微分学
查看>>
UVa 11790 - Murcia&#39;s Skyline
查看>>
启动时创建线程并传递数据
查看>>
汉字正字表达式解决方案
查看>>
lemon OA 下阶段工作安排
查看>>
WCF X.509验证
查看>>
Fatal error: Class 'GearmanClient' not found解决方法
查看>>
jsoup分解HTML DOM
查看>>
数据库分析与设计总结
查看>>
Axure RP介绍
查看>>
ini_set()函数的使用 以及 post_max_size,upload_max_filesize的修改方法
查看>>