SpringDataJpa使用原生sql(EntityManager)动态拼接,分页查询
SpringDataJpa
Spring Data JPA是较大的Spring Data系列的一部分,可轻松实现基于JPA的存储库。该模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring支持的应用程序变得更加容易。
实现应用程序的数据访问层已经很长一段时间了。为了执行简单查询以及执行分页和审核,必须编写太多样板代码。Spring Data JPA旨在通过将工作量减少到实际需要的数量来显着改善数据访问层的实现。作为开发人员,您将编写包括自定义finder方法在内的存储库接口,Spring会自动提供实现。
使用EntityManager 来创建原生查询语句
在service层的代码:
@PersistenceContext
EntityManager entityManager;
@Override
public Object findMeetingSignRecoredPage(Long meetingId, Integer pageIndex, Integer pageSize) {
MeenoAssert.notNull(meetingId, ErrEnum.MEETING_ID_IS_EMPTY);
Meeting meeting = this.meetingRepository.getOne(meetingId);
MeenoAssert.notNull(meeting,ErrEnum.MEETING_IS_NOT_EXIST);
Pageable pageable = PageUtils.getPageable(pageIndex,pageSize);
StringBuilder sql = new StringBuilder();
sql.append(" select ep.name,MAX(r.sign) from mnt_emp_rel_meeting as e ");
sql.append(" left join mnt_sign_record as r on(r.employee_id=e.employee_id) ");
sql.append(" left join mnt_employee as ep on(ep.id = e.employee_id) ");
sql.append(" where e.meeting_id = ? ");
sql.append(" order by r.sign desc,r.create_date asc ");
Query query = entityManager.createNativeQuery(sql.toString());
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
query.setParameter(1,meetingId);
List<Object[]> list = query.getResultList();
List<SignRecordView> listView = Lists.newArrayList();
if(list != null && !list.isEmpty()){
for (Object[] objects : list) {
String empName = objects[0]==null?null:objects[0].toString();
Integer sign = objects[1]==null?Constants.SIGN_RECORD_NO:Integer.parseInt(objects[1].toString());
SignRecordView view = new SignRecordView();
view.setEmployeeName(empName);
view.setSign(sign);
listView.add(view);
}
}
//count
StringBuilder countSql = new StringBuilder();
countSql.append(" select count(distinct e.id) from mnt_emp_rel_meeting as e ");
countSql.append(" left join mnt_sign_record as r on(r.employee_id=e.employee_id) ");
countSql.append(" left join mnt_employee as ep on(ep.id = e.employee_id) ");
countSql.append(" where e.meeting_id = ? ");
countSql.append(" order by r.sign desc,r.create_date asc ");
Query countQuery = entityManager.createNativeQuery(countSql.toString());
countQuery.setParameter(1,meetingId);
Object singleResult = countQuery.getResultList().get(0);
Integer count = singleResult==null?0:Integer.valueOf(singleResult.toString());
Map<String, Object> resultPage = PageUtils.getResultPage(count, listView);
return resultPage;
}
PageUtils工具类代码如下:
package com.meeno.framework.page.utils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @description: 分页工具类
* @author: Wzq
* @create: 2019-12-26 20:19
*/
@Data
public class PageUtils {
/**
*@Description 获取集合分页对象
*@Param [list, pageIndex, pageSize]
*@Return void
*@Author Wzq
*@Date 2020/1/6
*@Time 14:07
*/
public static <T> Map<String,Object> getCollectionPage(List<T> list, Pageable pageable){
if(list==null||list.isEmpty()){
return PageUtils.getResultPage(0,null );
}
int offset = pageable.getOffset();
int pageSize = pageable.getPageSize();
List<T> listView = Lists.newArrayList();
if(list!=null && !list.isEmpty()){
if(list.size() < offset){
return PageUtils.getResultPage(0,null );
}
for(;list.size() > offset && pageSize != 0 ; offset++,pageSize--){
listView.add(list.get(offset));
}
return PageUtils.getResultPage(list.size(),listView);
}
return PageUtils.getResultPage(0,null );
}
/**
*@Description 根据pageIndex和pageSize获取Pageable
*@Param [pageIndex, pageSize]
*@Return org.springframework.data.domain.Pageable
*@Author Wzq
*@Date 2019/12/27
*@Time 11:12
*/
public static Pageable getPageable(Integer pageIndex, Integer pageSize){
if(pageIndex==null){
pageIndex = 0;
}else{
pageIndex--;
}
if(pageSize==null){
pageSize = 10;
}
PageRequest pageRequest = new PageRequest(pageIndex, pageSize);
return pageRequest;
}
/**
*@Description 获取分页返回对象
*@Param [totalCount, list]
*@Return java.util.Map<java.lang.String,java.lang.Object>
*@Author Wzq
*@Date 2019/12/26
*@Time 20:22
*/
public static Map<String,Object> getResultPage(Page<?> page, List<?> list){
Map<String,Object> resultPageMap = Maps.newHashMap();
resultPageMap.put("totalCount",page.getTotalElements());
resultPageMap.put("list",list);
return resultPageMap;
}
public static Map<String,Object> getResultPage(Integer count, List<?> list){
Map<String,Object> resultPageMap = Maps.newHashMap();
resultPageMap.put("totalCount",count);
resultPageMap.put("list",list);
return resultPageMap;
}
}
SpringDataJpa使用原生sql(EntityManager)动态拼接,分页查询的更多相关文章
- Java数据库学习之SQL语句动态拼接
public class UserDaoImpl implements UserDao { @Override public List<User> getUserByPage(PageIn ...
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句
一:分页需求: 客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的 ...
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句(转)
http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...
- JAVA 中SQL字符动态拼接
select SYR,SFZMHM,CJRZH,XSZBH,HPHM,CLSBDH,FDJH,CLLX,ZDYZT,to_char(CCDJRQ,'YYYY-MM-DD') CCDJRQ from V ...
- webform中实现SQL Sever2008数据库数据分页查询
1 分页 1.1 数据库中存储过程 已知 当前页 pageIndex 页容量 pageSize 求 总页数 pageCou ...
- SQL Server 存储过程进行分页查询
CREATE PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage INT = 1 , --当前页页码 (即Top currPage) @showColum ...
- SQL 存储过程 多条件 分页查询 性能优化
最优化查询代码 -- 注意:此处可能会出现 字符串过长问题,所以 必要的情况下请分段处理 set @sql1 =' SELECT * FROM ( select ROW_NUMBER() OVER(O ...
- 使用JSTL的sql:query标签制作分页查询遇到NoSuchFieldError: deferredExpression
参考:http://hi.baidu.com/desyle/item/4fe650265792d7182a0f1c33 症状: 如题所述,代码如下 <sql:query var="re ...
随机推荐
- JS中 var,let与const的区别
1.在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . cons ...
- Android系统编程入门系列之界面Activity交互响应
在上篇文章中已经了解到界面Activity的绘制完全依赖其加载的视图组件View,不仅如此,用户的每次触摸操作都可以在界面Activity内接收并响应,也可以直接传递给其中的某个视图View响应.本文 ...
- YAOI Round #5 题解
前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/13 Div.2 : http://47.110.12.131:9016/contest/12 D ...
- 必须要了解的Linux基本操作
Linux常用的基础操作 1.命令行提示字符 2.切换用户 3.查看当前主机的完整名称 4.临时设置主机 ...
- C语言:宏定义 本质及体现
- 你有没有乱用“leader”,担当是个好东西
PS:此文为个人认知,不足处请多多批评. 近期在一线leader(经理)身上发现了几个case,然后又回想起前几年自己做的一些傻事,可能都属于明面上leader不会说什么,但私下会有情绪的类型: Ca ...
- Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用
Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...
- POJ4007 Flood-it! 题解
调得我快死了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!! 先自己写了几发,老是 T,然后去看题解,大体思路居然都差不多,估计是自己写挂了orz. 几乎所有题解都有个vis数组,真 nm 看不懂到底是什么意思 ...
- POJ1456 Supermarket 题解
思维题. 关键在于如何想到用堆来维护贪心的策略. 首先肯定是卖出的利润越大的越好,但有可能当前这天选定了利润最大的很久才过期而利润第二大的第二天就过期,这时的策略就不优了. 所以我们必须动态改变策略, ...
- 第十七篇 -- QTreeWidget与QDockWidget
效果图: 目录和工具条的创建在前面几节就已经学过了,所以目录和工具条的布局可以自己画. 那么下面的部分,左侧是一个DockWidget,里面放置一个TreeWidget.右边是一个ScrollArea ...