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)动态拼接,分页查询的更多相关文章

  1. Java数据库学习之SQL语句动态拼接

    public class UserDaoImpl implements UserDao { @Override public List<User> getUserByPage(PageIn ...

  2. MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)

    http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...

  3. MySql实现分页查询的SQL,mysql实现分页查询的sql语句

    一:分页需求: 客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的 ...

  4. MySql实现分页查询的SQL,mysql实现分页查询的sql语句(转)

    http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...

  5. JAVA 中SQL字符动态拼接

    select SYR,SFZMHM,CJRZH,XSZBH,HPHM,CLSBDH,FDJH,CLLX,ZDYZT,to_char(CCDJRQ,'YYYY-MM-DD') CCDJRQ from V ...

  6. webform中实现SQL Sever2008数据库数据分页查询

    1 分页     1.1         数据库中存储过程             已知 当前页  pageIndex  页容量 pageSize             求  总页数 pageCou ...

  7. SQL Server 存储过程进行分页查询

    CREATE PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage INT = 1 , --当前页页码 (即Top currPage) @showColum ...

  8. SQL 存储过程 多条件 分页查询 性能优化

    最优化查询代码 -- 注意:此处可能会出现 字符串过长问题,所以 必要的情况下请分段处理 set @sql1 =' SELECT * FROM ( select ROW_NUMBER() OVER(O ...

  9. 使用JSTL的sql:query标签制作分页查询遇到NoSuchFieldError: deferredExpression

    参考:http://hi.baidu.com/desyle/item/4fe650265792d7182a0f1c33 症状: 如题所述,代码如下 <sql:query var="re ...

随机推荐

  1. 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

    这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...

  2. PYTHON 解决ModuleNotFoundError: No module named 'win32com'

    d:\python37\scripts\>pip install pypiwin32

  3. ADB命令 连接WIFI检测序列号

    利用ADB 电脑与手机相连 查看序列号: adb shell  getprop ro.serialno 查看机器的SN号 adb shell getprop 查看机器的全部信息参数 查看IP地址: a ...

  4. VUE 之_this.da 和 this

    作者:张艳涛 日期:2020-07-29 this用在第一层,如果在JS第3二层,要用 _this importfxx(obj) { let _this = this; let inputDOM = ...

  5. CC2B本地环境搭建步骤及部署问题解决

    由于最近的项目是之前没接触过的netbeans+glassfish,记录一下最近在工作中搭建本地环境的步骤及遇到的一些问题解决方法: 1.配置java jdk 此过程中遇到一个问题就是在配置系统环境变 ...

  6. 使用分区助手转移windows 10系统出现黑屏boot manager报错问题。

    问题原因: 在使用分区助手迁移windows 10到ssd中,设置完boot管理器后,出现黑屏问题, 经过长时间的搜索,发现在迁移系统的时候,只迁移了C盘的系统,没有连同msr引导 文件一同传过去,会 ...

  7. 使用java AWT做一个增加按钮的简单菜单窗体

    package com.ysq.Swing; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Flow ...

  8. tp phpexcel 导入后台访问方法

    public function addall(){ $Water = M('Waterrate'); $config = array( 'maxSize' => 0, 'rootPath' =& ...

  9. XSS靶机

    第一关 localhost:8083/xss/level1.php?name=test<script>alert(1)</script> 第二关 源码 文本框输入js代码,查看 ...

  10. 服务网格Istio入门-详细记录Kubernetes安装Istio并使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,文章更新也只在官网,欢迎大家来喝茶~~ 1 服务网格Istio Istio是开源的Service Mesh实现,一般用于Kubernetes ...