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. ADO.NET整理 [转]

    虽然我们都知道ADO.NET是对数据库的操作,但是要真的说出ADO.NET的具体含义还不是很容易. ADO.NET是ActiveX Data Objects的缩写,它是一个COM组件库,用于在micr ...

  2. 「ARC103D」 Distance Sums

    「ARC103D」 Distance Sums 传送门 水题. 首先如果让你求树上的节点 \(i\) 到其它所有节点的距离和,这是非常简单的,这就是非常常规的换根 \(\texttt{DP}\). 那 ...

  3. CentOS 命令提示符

    命令提示符的设置就是对PS1的配置: export PS1="\[\e[35;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\[\e[36;40m\]\h  \[\e ...

  4. C语言:统计字符个数及种类

    #include <stdio.h> int main(){ char c; //用户输入的字符 int shu=0;//字符总数 int letters=0, // 字母数目 space ...

  5. HTML5-CSS(一)

    一.创建 CSS 样式表有三种方式 1. 元素内嵌样式<p style="color:red;font-size:50px;">这是一段文本</p>解释:即 ...

  6. 单机版kafka的安装

    简单记录单机版kafka的安装:JDK1.8(jdk-8u131-linux-x64.rpm)zookeeper (zookeeper-3.4.10.tar.gz)kafka (kafka_2.12- ...

  7. Maven工程 报 Diamond types are not supported at language level '5'

    Maven工程 报 Diamond types are not supported at language level '5' 出现这种信息,一般表示的是你的language level(IDEA下J ...

  8. etcd学习(3)-grpc使用etcd做服务发现

    grpc通过etcd实现服务发现 前言 服务注册 服务发现 负载均衡 集中式LB(Proxy Model) 进程内LB(Balancing-aware Client) 独立 LB 进程(Externa ...

  9. windows下python -m pip install --upgrade pip升级后报错的解决方法

    前言: 笔者装某库的时候提示需要升级pip版本,就python -m pip install --upgrade pip默认升级了,结果升级之后只要输入pip就有报错(如下图),网上百度了很多解决方法 ...

  10. 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."

    API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...