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;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值