【spring data jpa】带有条件的查询后分页和不带条件查询后分页实现

一.不带有动态条件的查询 分页的实现

 实例代码:

controller:返回的是Page<>对象

@Controller
@RequestMapping(value = "/egg")
public class EggController {
 @ResponseBody
    @RequestMapping(value = "/statisticsList")
    public Page<StatisticsDto> statisticsList(@RequestParam("actId") Long actId,HttpServletRequest request,
                                              Pageable pageable){
        Long entId = CasUtils.getEntId(request);
        return eggService.findStatisticsWithPage(entId,actId,pageable) ;
    }
}
serviceImpl中的实现方法: 这里需要查询出数据的数量total,以及查询到的数据list,最后new一个实现类 new PageImpl(list,pageable,total)

                    Page 的实现类是PageImpl          Pageable 的实现类是PagerRequest

    public Page<StatisticsDto> findStatisticsWithPage(Long entId, Long actId, Pageable pageable) {
        int total = wactPlayRecordDao.findDistinctPlayRecordTotal(entId, actId);
//        List<String> openIdList = wactPlayRecordDao.findDistinctPlayRecordList(entId, actId);
        List<WactPlayRecord> wactPlayRecordList = wactPlayRecordDao.findDistinctPlayRecordList(entId,actId);
        List<StatisticsDto> statisticsDtoList = new ArrayList<>();
        if (wactPlayRecordList.size()>0){
//            statisticsDtoList = new ArrayList<>(wactPlayRecordList.size());
            for (WactPlayRecord wactPlayRecord:wactPlayRecordList){
                StatisticsDto statisticsDto = new StatisticsDto();
                String openid = wactPlayRecord.getOpenid();
                Long playRecordId = wactPlayRecord.getId();
                Mpuser mpuser = mpuserDao.findMpUserByOpenId(openid);
                List<CustomerCollItemInfo> customerCollItemInfoList = customerCollitemInfoDao.findCustomerCollItemInfoByOpenId(openid,entId,actId,playRecordId);
                List<CustCollItemsInfoDto> custCollItemsInfoDtoList = new ArrayList<>();
                if (customerCollItemInfoList.size()>0){
                    statisticsDto.setDetailIsShow("able");
                    custCollItemsInfoDtoList = new ArrayList<>(customerCollItemInfoList.size());
                    for (CustomerCollItemInfo customerCollItemInfo:customerCollItemInfoList){
                        CustCollItemsInfoDto custCollItemsInfoDto = new CustCollItemsInfoDto(customerCollItemInfo);
                        custCollItemsInfoDtoList.add(custCollItemsInfoDto);
                    }
                }else{
                    //已中奖但是未填写&&未中奖
                    statisticsDto.setDetailIsShow("unable");
                }
                if (wactPlayRecord.getIsWin()==0){
                    wactPlayRecord.setIsUse(2);
                }
                WactPlayRecordDto wactPlayRecordDto = new WactPlayRecordDto(wactPlayRecord);
                MpuserDto mpuserDto = null;
                if (mpuser!= null){
                    mpuserDto = new MpuserDto(mpuser);
                }
                statisticsDto.setWactPlayRecordDto(wactPlayRecordDto);
                statisticsDto.setCustCollItemsInfoDtoList(custCollItemsInfoDtoList);
                statisticsDto.setMpuserDto(mpuserDto);

                statisticsDtoList.add(statisticsDto);
            }
        }
        return new PageImpl(statisticsDtoList,pageable,total);
    }

dao:需要继承JpaRepository

public interface WactPlayRecordDao extends JpaRepository<WactPlayRecord, Long>{


 @Query("FROM WactPlayRecord w WHERE w.entId = :endId AND w.actId = :actId AND w.status = 1")
    List<WactPlayRecord> findDistinctPlayRecordList(@Param("endId") Long endId,@Param("actId") Long actId);
<pre name="code" class="java">@Query("SELECT count(w.openid) FROM WactPlayRecord w WHERE w.entId = :endId AND w.actId = :actId AND w.status = 1")
    int findDistinctPlayRecordTotal(@Param("endId") Long endId,@Param("actId") Long actId);

}

 

二。带有查询条件,两种方法

    方式1(使用与查询条件在一个实体类中).:

       controller:同样是返回的Page<>对象 ,增加了表单提交的数据对象

@Controller
@RequestMapping("/news")
public class NewsController {
    private NewsService newsService;
    private NewsCategoryService newsCategoryService;
   
    @RequestMapping("/list")
    @ResponseBody
    public Page<NewsDto> list(Pageable pageable, NewsCondition newsCondition) {
        Long id = AppUtils.getBean("loginInfo", LoginInfo.class).getEntId();
        newsCondition.setEntId(id);
        return newsService.find(newsCondition, pageable);
    }

}

    serviceImpl

@Service
public class NewsServiceImpl implements NewsService {
@Override
    @Transactional(readOnly = true)
    public Page<NewsDto> find(final NewsCondition condition, Pageable pageable) {
        Page<NewsEntity> page = newsDao.findAll(new Specification<NewsEntity>() {
            @Override
            public Predicate toPredicate(Root<NewsEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> list = new ArrayList<>();
                list.add(cb.equal(root.get("entId").as(Long.class), condition.getEntId()));
                list.add(cb.equal(root.get("deleted").as(Boolean.class), false));
                Join<NewsEntity, NewsCategoryEntity> newsCategoryJoin = root.join("newsCategory");
                list.add(cb.equal(newsCategoryJoin.get("enable").as(Boolean.class), true));
                list.add(cb.equal(newsCategoryJoin.get("deleted").as(Boolean.class), false));
                if (condition.getCategoryId() != null) {
                    list.add(cb.equal(newsCategoryJoin.get("id").as(Long.class), condition.getCategoryId()));
                }
                if (StringUtils.isNotBlank(condition.getTitle())) {
                    list.add(cb.like(root.get("title").as(String.class), "%" + condition.getTitle() + "%"));
                }
                if (condition.getFromDate() != null) {
                    list.add(cb.greaterThanOrEqualTo(root.get("createdDate").as(Date.class), DateUtils.getDateWithStartSecond(condition.getFromDate())));
                }
                if (condition.getToDate() != null) {
                    list.add(cb.lessThanOrEqualTo(root.get("createdDate").as(Date.class), DateUtils.getDateWithLastSecond(condition.getToDate())));
                }
                query.orderBy(cb.desc(root.get("top")), cb.desc(root.get("id")));
                Predicate[] predicates = new Predicate[list.size()];
                predicates = list.toArray(predicates);
                return cb.and(predicates);
            }
        }, pageable);

        if (page.hasContent()) {
            List<NewsEntity> newsEntities = page.getContent();
            List<NewsDto> newsDtos = new ArrayList<>(newsEntities.size());
            List<Long> pids = new ArrayList<>();
            for (NewsEntity newsEntity : newsEntities) {
                if (newsEntity.getTitleImage() != null) {
                    pids.add(newsEntity.getTitleImage());
                }
            }
            Map<Long, MediaFileEntity> map = null;
            if (CollectionUtils.isNotEmpty(pids)) {
                map = mediaFileDao.findWithMap(pids);
            }
            for (NewsEntity newsEntity : newsEntities) {
                newsDtos.add(new NewsDto(newsEntity, map != null ? map.get(newsEntity.getTitleImage()) : null));
            }
            return new PageImpl(newsDtos, pageable, page.getTotalElements());
        }
        return null;
    }
}

dao:这里一定要继承JpasSpecificationExecutor,然后使用其中的findAll()方法,其中封装了分页方法,排序方法等

public interface NewsDao extends JpaRepository<NewsEntity, Long>, JpaSpecificationExecutor<NewsEntity> {

 }

  方式二( 查询条件在不同表中的情形):底层DAO使用sql拼装,service中仍然使用new PageImpl的方法

      controller

   

@Controller
@RequestMapping(value = "/egg")
public class EggController {


    @ResponseBody
    @RequestMapping(value = "/statisticsList")
    public Page<StatisticsDto> statisticsList(@RequestParam("actId") Long actId,HttpServletRequest request,
                                              Pageable pageable,StatisticsCondition statisticsCondition){
        Long entId = CasUtils.getEntId(request);
        return eggService.findStatisticsWithPage(entId,actId,pageable,statisticsCondition) ;
    }


serviceImpl

    @Override
    @Transactional
    public Page<StatisticsDto> findStatisticsWithPage(Long entId, Long actId, Pageable pageable, StatisticsCondition statisticsCondition) {
        Long total = wactPlayRecordDao.findTotalByCondition(entId,actId,
                statisticsCondition.getParticipateBegin(),statisticsCondition.getParticipateEnd()
                ,statisticsCondition.getTelephone(),statisticsCondition.getIsWin(),statisticsCondition.getIsUse());
        List<StatisticsDto> statisticsDtoList = new ArrayList<>();
        if (total >0){
            List<Object[]> objectList = wactPlayRecordDao.findStatisticsByConditionWithPage(entId,actId,
                    statisticsCondition.getParticipateBegin(),statisticsCondition.getParticipateEnd()
                    ,statisticsCondition.getTelephone(),statisticsCondition.getIsWin(),statisticsCondition.getIsUse(),pageable);
            for (Object[] obj:objectList){
                StatisticsDto statisticsDto = new StatisticsDto();
                Long id = new BigInteger(obj[0].toString()).longValue();
                Integer isWin = new Short(obj[1].toString()).intValue();
                Integer isUse = new Short(obj[2].toString()).intValue();
                String createdDateStr = com.raipeng.micro.core.utils.DateUtils.format((Date)obj[4], com.raipeng.micro.core.utils.DateUtils.PATTERN_2);
                WactAwards wactAwards = new WactAwards();
                Long awardsId = new BigInteger(obj[5].toString()).longValue();
                if (awardsId != 0l){
                    wactAwards = wactAwardsDao.findAwardByAwardId(awardsId);
                }
                if (isWin == 0){
                    isUse = 2;
                }

                WactPlayRecordDto wactPlayRecordDto = new WactPlayRecordDto(id,isWin,isUse,(String)obj[3],wactAwards.getName(),wactAwards.getGradeName(),createdDateStr);

                String openid = (String)obj[3];
                Long playRecordId = wactPlayRecordDto.getId();
                List<CustomerCollItemInfo> customerCollItemInfoList = customerCollitemInfoDao.findCustomerCollItemInfoByPlayRecordId(playRecordId);
                List<CustCollItemsInfoDto> custCollItemsInfoDtoList = new ArrayList<>();
                if (customerCollItemInfoList.size()>0){
                    statisticsDto.setDetailIsShow("able");
                    custCollItemsInfoDtoList = new ArrayList<>(customerCollItemInfoList.size());
                    for (CustomerCollItemInfo customerCollItemInfo:customerCollItemInfoList){
//                        customerCollItemsIds +=customerCollItemInfo.getCustomerCollectitemsId()+"#";
                        CustCollItemsInfoDto custCollItemsInfoDto = new CustCollItemsInfoDto(customerCollItemInfo);
                        custCollItemsInfoDtoList.add(custCollItemsInfoDto);
                    }
                }else{
                    //已中奖但是未填写&&未中奖
                    statisticsDto.setDetailIsShow("unable");
                }

                Object[] object = wactPlayRecordDao.findUserInfoByOpenId(openid);
                MpuserDto mpuserDto = new MpuserDto();
                if (object[1] != null){
                    mpuserDto.setHeadImg((String)object[1]);
                }else if (object[3] != null){
                    mpuserDto.setHeadImg((String)object[3]);
                }else {
                    mpuserDto.setHeadImg("");
                }
                if (object[2] != null){
                    mpuserDto.setNickName((String)object[2]);
                }else if (object[4] != null){
                    mpuserDto.setNickName((String)object[4]);
                }else {
                    mpuserDto.setNickName("");
                }
                if (wactPlayRecordDto.getIsWin()=="已中奖" && custCollItemsInfoDtoList.size()==0){
                    wactPlayRecordDto.setIsUse("");
                }
                if (mpuserDto.getHeadImg()==""){
                    statisticsDto.setHeadImg("unable");
                }else{
                    statisticsDto.setHeadImg("able");
                }
                if (wactPlayRecordDto.getIsUse()=="已领取"){
                    statisticsDto.setHaveReceived("able");
                }else {
                    statisticsDto.setHaveReceived("unable");
                }
                statisticsDto.setWactPlayRecordDto(wactPlayRecordDto);
                statisticsDto.setCustCollItemsInfoDtoList(custCollItemsInfoDtoList);
                statisticsDto.setMpuserDto(mpuserDto);
                if (wactPlayRecordDto.getIsUse()=="未领取"){
                    statisticsDto.setSetReceive("able");
                }else {
                    statisticsDto.setSetReceive("unable");
                }

                String customerCollItemsIds = "";
                List<CustomerCollectItems> customerCollectItemsList = customerCollectItemsDao.findListByActivityId(actId);
                if (customerCollectItemsList != null && customerCollectItemsList.size()>0){
                    for (CustomerCollectItems customerCollectItems:customerCollectItemsList){
                        customerCollItemsIds += customerCollectItems.getCollectItemsId()+"#";
                    }
                }
                statisticsDto.setCustomerCollectItemsIds(customerCollItemsIds);
                statisticsDtoList.add(statisticsDto);
            }
        }

        return new PageImpl<StatisticsDto>(statisticsDtoList,pageable,total);
    }
dao   daoplus  daoImpl(dao继承daoPlus,daoImpl实现daoPlus)

daoplus

public interface WactPlayRecordPlusDao {
 Long findTotalByCondition(Long entId,Long actId,Date participateBegin,Date participateEnd,String telephone,Integer isWin,Integer isUse);

List<Object[]> findStatisticsByConditionWithPage(Long entId, Long actId, Date participateBegin, Date participateEnd, String telephone, Integer isWin, Integer isUse,Pageable pageable);
}
daoImpl

public class WactPlayRecordDaoImpl implements WactPlayRecordPlusDao {
@PersistenceContext
    private EntityManager entityManager;

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    public Long findTotalByCondition(Long entId, Long actId, Date participateBegin, Date participateEnd, String telephone, Integer isWin, Integer isUse) {
        StringBuffer sql = null;
        if (telephone != null && !"".equals(telephone)){
//            hql = new StringBuffer("SELECT w.id,w.isWin,w.isUse,W.openid " +//表没有关联所以不能使用面向对象语句的left outer join inner join 等
//                    "FROM WactPlayRecord w inner join CustomerCollItemInfo c " +
//                    "ON w.id = c.playRecordId" +
//                    "WHERE w.entId = :entId AND w.actId = :actId AND w.status = 1 " +
//                    "AND c.entId = :entId AND c.actId = :actId AND c.status = 1 And c.val = :telephone ");
            sql =new StringBuffer("SELECT count(p.id)" +
                    "FROM rp_act_play_record p inner join rp_act_customer_collitem_info c " +
                    "ON p.id = c.play_record_id " +
                    "WHERE p.ent_id = :entId AND p.act_id = :actId AND p.status = 1 " +
                    "AND c.ent_id = :entId AND c.act_id = :actId AND c.status = 1 And c.val = :telephone ");
        }else {
//            hql = new StringBuffer("SELECT w.id,w.isWin,w.isUse,w.openid " +
//                    "FROM WactPlayRecord w " +
//                    "WHERE w.entId = :entId AND w.actId = :actId AND w.status = 1 " );
            sql = new StringBuffer("SELECT count(p.id) " +
                    "FROM rp_act_play_record p " +
                    "WHERE p.ent_id = :entId AND p.act_id = :actId AND p.status = 1 " );
        }
        if (participateBegin != null){
            sql.append("AND p.created_date >= :participateBegin ");
        }
        if (participateEnd != null){
            sql.append("AND p.created_date <= :participateEnd ");
        }
        if (isWin == 0){
            sql.append("AND p.is_win = 0 ");
        }else if (isWin ==1){
            sql.append("AND p.is_win = 1 ");
        }
        if (isUse == 0){
            sql.append("AND p.is_use = 0 ");
        }else if (isUse == 1){
            sql.append("AND p.is_use = 1 ");
        }
        sql.append("order by p.created_date ASC");
        Query query = entityManager.createNativeQuery(sql.toString());
        query.setParameter("entId", entId).setParameter("actId", actId);
        if (participateBegin != null){
            query.setParameter("participateBegin", participateBegin);
        }
        if (participateEnd != null){
            query.setParameter("participateEnd", participateEnd);
        }
        if (telephone != null && !"".equals(telephone)){
            query.setParameter("telephone",telephone);
        }
        Long total = new BigInteger(query.getSingleResult().toString()).longValue();
        return total;
    }

    @Override
    public List<Object[]> findStatisticsByConditionWithPage(Long entId, Long actId, Date participateBegin, Date participateEnd, String telephone, Integer isWin, Integer isUse,Pageable pageable) {
        StringBuffer sql = null;
        if (telephone != null && !"".equals(telephone)){
//            hql = new StringBuffer("SELECT w.id,w.isWin,w.isUse,W.openid " +
//                    "FROM WactPlayRecord w inner join CustomerCollItemInfo c " +
//                    "ON w.id = c.playRecordId" +
//                    "WHERE w.entId = :entId AND w.actId = :actId AND w.status = 1 " +
//                    "AND c.entId = :entId AND c.actId = :actId AND c.status = 1 And c.val = :telephone ");
           sql =new StringBuffer("SELECT p.id,p.is_win,p.is_use,p.openid,p.created_date,p.awards_id " +
                    "FROM rp_act_play_record p inner join rp_act_customer_collitem_info c " +
                    "ON p.id = c.play_record_id " +
                    "WHERE p.ent_id = :entId AND p.act_id = :actId AND p.status = 1 " +
                    "AND c.ent_id = :entId AND c.act_id = :actId AND c.status = 1 And c.val = :telephone ");
        }else {
//            hql = new StringBuffer("SELECT w.id,w.isWin,w.isUse,w.openid " +
//                    "FROM WactPlayRecord w " +
//                    "WHERE w.entId = :entId AND w.actId = :actId AND w.status = 1 " );
            sql = new StringBuffer("SELECT p.id,p.is_win,p.is_use,p.openid,p.created_date,p.awards_id " +
                    "FROM rp_act_play_record p " +
                    "WHERE p.ent_id = :entId AND p.act_id = :actId AND p.status = 1 " );
        }
        if (participateBegin != null){
            sql.append("AND p.created_date >= :participateBegin ");
        }
        if (participateEnd != null){
            sql.append("AND p.created_date <= :participateEnd ");
        }
        if (isWin == 0){
            sql.append("AND p.is_win = 0 ");
        }else if (isWin ==1){
            sql.append("AND p.is_win = 1 ");
        }
        if (isUse == 0){
            sql.append("AND p.is_use = 0 ");
        }else if (isUse == 1){
            sql.append("AND p.is_use = 1 ");
        }
        sql.append("order by p.created_date DESC");
        Query query = entityManager.createNativeQuery(sql.toString());
        query.setParameter("entId", entId).setParameter("actId", actId);
        if (participateBegin != null){
            query.setParameter("participateBegin", participateBegin);
        }
        if (participateEnd != null){
            query.setParameter("participateEnd", participateEnd);
        }
        if (telephone != null && !"".equals(telephone)){
            query.setParameter("telephone",telephone);
        }
        query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());
        query.setMaxResults(pageable.getPageSize());
        List<Object[]> objectList = query.getResultList();
        return objectList;
    }



                 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值