jhipster(springboot+datatable+jpa)后台分页,总结
最近用datatable做了一个后台分页,但是后台实体原本没写DTO。就碰到的问题做了一下总结
一、datatable使用get方式传数据到后台,这是正常的后台分页,不涉及过滤查询和前端传递的排序字段,后面会细讲
后台使用
@GetMapping("/jobs")
@ResponseBody
public ResponseEntity<List<AuditJob>> getAllTestPages(@ApiParam Pageable pageable) {
log.debug("REST request to get a page of TestPages");
Page<AuditJob> page = auditJobRepository.findAll(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/test-pages");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
二、使用DTO
sql语句:
这里需要注意的是,
1、这里用到了DTO,自己建了一个实体类的DTO,只查询出自己需要的字段,但是字段名必须和Dto的构造参数字段操持一致
2、自定义的查询方法,要加上@Modifing
3、这里使用的对象查询,所以sql语句中要和实体的属性名对应,如果要写原生sql语句,就要写在括号里面加 , nativeQuery = true
4、Dto类要有getter和setter、构造方法
5、自定义的查询方法不能用自带的Pageable参数,如果要分页需要自己写分页语句。使用框架自带的分页查询泛型必须是数据库存在的实体
@Transactional
@Query(value = "select new com.famessoft.oplus.cac.domain.AuditJobDto(id,templateName,createdBy,createdAt,endedAt,auditParams,jobStatus) " +
"from AuditJob order by ?3 ?4 limit ?1,?2")
@Modifying
List<AuditJobDto> findAuditDtoByPage(String start,String end,String orderCol,String order);//这里的end是start+length
这里使用了DTO,要写包名,不然会不认识
注意,泛型那里是返回没有DTO的实体,这样子自己就回映射(注意字段名一定要对应)
这里不是自定义的方法,所以不用写@modifing,这是根据jpa的标准语法来写的
@Query(value = "select new com.famessoft.oplus.cac.domain.AuditJobDto(job.id,job.templateName,job.createdBy,job.createdAt,job.endedAt,job.auditParams,job.jobStatus) " +
"from AuditJob job ")
Page<AuditJob> findAuditJobByPage(Pageable pageable);
带分页的查询和过滤
@PostMapping("/jobs/page")
@ResponseBody
public DataTables getAllTestPages(@RequestParam(value = "start", defaultValue = "0") Integer start,
@RequestParam(value = "length", defaultValue = "10") Integer length,
HttpServletRequest request) {
String search = request.getParameter("search[value]");
//针对一个字段排序的
String orderColumn = request.getParameter("order[0][column]");
String order = request.getParameter("order[0][dir]");
//给出默认排序的字段
String sortCol = null;
Sort sort = null;
//获取排序字段
if (orderColumn != null && orderColumn != "") {
//获取datatable排序列(从0开始)
int orderCol = Integer.valueOf(orderColumn);
sortCol = request.getParameter("columns[" + orderCol + "][data]");
if (order != null) {
if (order.toUpperCase().equals(Sort.Direction.DESC)) {
sort = new Sort(Sort.Direction.DESC, sortCol);
} else if (order.toUpperCase().equals(Sort.Direction.ASC)) {
sort = new Sort(Sort.Direction.ASC, sortCol);
}
}
}
DataTables dataTables = new DataTables();
Pageable pageable = new PageRequest(start / length, length, sort);
Page<AuditJob> page = auditJobRepository.findAuditJobByPage(pageable);
if (search == null || search.equals("")) {
dataTables.setData(page.getContent());
dataTables.setRecordsTotal(page.getTotalElements());
dataTables.setRecordsFiltered(page.getTotalElements());
return dataTables;
} else {
//过滤查询
search = "%" + search + "%";
List<AuditJobDto> list = auditJobRepository.findAuditDtoLikeByPage(search);
Page<AuditJob> pageBySearch = auditJobRepository.findAuditJobLikeByPage(search,pageable);
dataTables.setData(pageBySearch.getContent());
dataTables.setRecordsTotal(page.getTotalElements());//这是数据总的条数
dataTables.setRecordsFiltered(pageBySearch.getTotalElements());//过滤查询之后的总数
return dataTables;
}
}
上面那样写其实有点傻,因为碰到了很多问题,因为datatable会吧对象的每个值拆分成每个键值对来传(现在不能回显了),不过类似于
obj={a:1,b:2}传到后台不是obj=>{a:1,b:2}
变成了obj[a]=1
obj[b]=2
这样的值,而且如果使用get方式传递的话中括号还会被转义,根本取不到值,因为key被转义了,所以我换成了post方式传递,取值的方法很笨,但是我还没查到
java针对datatable标准的接收方法,好的一点是,datatable传值的方式是不会变的,所以这样取datatable的值也不会出错,只是代码看起来不是很舒服而已
sql查询语句
这里写了对多字段的模糊查询,所以写了contat函数,但是这个函数针对模糊查询字段等于null的话,这条数据就不会被查询出来,所以需要用ifnull,
还有个小问题,写了IFNULL函数之后,编译会报错,但是不用管它,这个会正常运行的
https://blog.csdn.net/yaoyao9565/article/details/51305854
@Query(value = "select new com.famessoft.oplus.cac.domain.AuditJobDto(job.id,job.templateName,job.createdBy,job.createdAt,job.endedAt,job.auditParams,job.jobStatus) " +
"from AuditJob job where concat(IFNULL(templateName,'') ,IFNULL(createdBy,''),IFNULL(createdAt,''),IFNULL(endedAt,''),IFNULL(auditParams,''),IFNULL(jobStatus,'')) like ?1 ")
Page<AuditJob> findAuditJobLikeByPage(String search,Pageable pageable);
注:
我如果重写findAll()或者自定义查询然后只取部分的属性,会导致我调用findOne的时候也会只取那些属性。但是后面好像又好了,有点莫名其妙
jhipster(springboot+datatable+jpa)后台分页,总结的更多相关文章
- Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务
1 前言 之前整理了一个spring+jotm实现的分布式事务实现,但是听说spring3.X后不再支持jotm了,jotm也有好几年没更新了,所以今天整理springboot+Atomikos+jp ...
- 【极简版】SpringBoot+SpringData JPA 管理系统
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已经讲解了如何从零搭建一个SpringBo ...
- 带你搭一个SpringBoot+SpringData JPA的环境
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...
- 二、springboot使用jpa
花了几天时间,好好看了看springboot的jpa部分,总结了常用的形式. 1.通过STS工具添加jpa的依赖项 要连mysql,测试的时候需要web,顺便添加了lombok不写set和get方法了 ...
- Springboot+MyBatis+JPA集成
1.前言 Springboot最近可谓是非常的火,本人也在项目中尝到了甜头.之前一直使用Springboot+JPA,用了一段时间发现JPA不是太灵活,也有可能是我不精通JPA,总之为了多学学Sp ...
- 第11章—使用对象关系映射持久化数据—SpringBoot+SpringData+Jpa进行查询修改数据库
SpringBoot+SpringData+Jpa进行查询修改数据库 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分.但它又不限于EJB 3.0,你可以在Web应用.甚至桌面应用 ...
- 集成Springboot+MyBatis+JPA
1.前言 Springboot最近可谓是非常的火,本人也在项目中尝到了甜头.之前一直使用Springboot+JPA,用了一段时间发现JPA不是太灵活,也有可能是我不精通JPA,总之为了多学学Spri ...
- SpringBoot Data JPA 关联表查询的方法
SpringBoot Data JPA实现 一对多.多对一关联表查询 开发环境 IDEA 2017.1 Java1.8 SpringBoot 2.0 MySQL 5.X 功能需求 通过关联关系查询商店 ...
- 用SpringBoot+MySql+JPA实现对数据库的增删改查和分页
使用SpringBoot+Mysql+JPA实现对数据库的增删改查和分页 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述 ...
随机推荐
- UI_storyboard实现页面回调
新建类 注意继承关系 #import <UIKit/UIKit.h> @interface CustomPopIt : UIStoryboardSegue @end #import &qu ...
- linux之进程管理详解
|-进程管理 进程常用命令 |- w查看当前系统信息 |- ps进程查看命令 |- kill终止进程 |- 一个存放内存中的特殊目 ...
- 微信小程序—智能小蜜(基于智能语义解析olami开放平台)
概述 该程序支持功能有查天气.查诗词.查百科.算算术.查日历.看笑话.看故事.聊天等,通过用户输入语句智能解析用户意图输出相应答案. 详细 代码下载:http://www.demodashi.com/ ...
- MySQL比较两个表不同的数据
在本教程中,您将学习如何比较两个表以找到不匹配的记录. 在数据迁移中,我们经常需要比较两个表,以便在一个表中标识另一个表中没有相应记录的记录. 例如,我们有一个新的数据库,其架构与旧数据库不同.我们的 ...
- 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例
你所不知道的 CSS 阴影技巧与细节 关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow ...
- jenkins二
破解管理员密码 1.假如我们忘记了Jenkins管理员密码了该怎么办呢?Jenkins没有用到数据库,所有的文件都是保存到xml文件里的 2.第一步找到admin所在的目录 [root@centos- ...
- IIS目录禁止执行权限
IIS6: IIS7:
- AngularJS实现鼠标右键事件
常规javascript鼠标右键直接在标签上加contextmenu="alert('a')"即可,现在angular通过directive来定义一个右键指令. app.direc ...
- xcode下build release版本号的.a库
1. 点击房子 图标button watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnlmZGl6dW8=/font/5a6L5L2T/fontsize/40 ...
- 动态修改 dom 元素的伪类样式
最近写代码,需要修改伪类的 content 属性,不想定义两个样式进行切换,而是直接通过 js 进行修改. html 中的伪类(如 a:hover / a:link / class::before / ...