spring data jpa分页查询示例代码

最近项目上用就hibernate+spring data jpa,一开始感觉还不错,但是随着对业务的复杂,要求处理一些复杂的sql,就顺便研究了下,把结果记录下,以便日后查看。用到Specification,需要继承JpaSpecificationExecutor接口。(下面代码有的分页从0开始作为第一页,有的从1开始作为作为第一页,我也忘记,请自己测试)

DAO层:

import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; 

@Repository
public interface CameraInfoRepo extends JpaRepository<CameraInfoPO, String>, JpaSpecificationExecutor<CameraInfoPO> { 

  @Query("select c from CameraInfoPO c where c.deviceInfo.id = ?1")
  public List<CameraInfoPO> findCamerasByDeviceId(String listDeviceInfoId); 

  //更新之后不清空缓存,在一个事务里查询到旧数据(hibernate)
  @Modifying
  @Query(value = "update CameraInfoPO c set c.isEnabled = 1 where c.id = ?1")
  public void updateEnabled(String cameraId); 

  //更新之后清空缓存,不保留旧对象(hibernate)
  @Modifying(clearAutomatically = true)
  @Query(value = "update CameraInfoPO c set c.isEnabled = 0 where c.id = ?1")
  public void updateUnEnabled(String cameraId); 

  //带条件的分页查询
  public Page<CameraInfoPO> findByIsEnabled(Integer isEnabled, Pageable pageable); 

}

DAO实现层

import java.util.ArrayList;
import java.util.List; 

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; 

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Repository; 

@Repository
public class CameraInfoRepoImpl { 

  @PersistenceContext
  private EntityManager em; 

  @Resource
  private CameraInfoRepo cameraInfoRepo; 

  public Page<CameraInfoPO> findCameraInfoByPage(Pageable pageable, Integer isEnabled) { 

    //CriteriaBuilder,用来构建CritiaQuery的构建器对象
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 

    //CriteriaQuery,它包含着查询语句的条件各个部分,比如:select 、from、where、group by、order by等
    CriteriaQuery<CameraInfoPO> criteriaQuery = criteriaBuilder.createQuery(CameraInfoPO.class); 

    //查询根,用于获取查询实例的属性,通过CriteriaQuery的from方法获取
    Root<CameraInfoPO> rootFrom = criteriaQuery.from(CameraInfoPO.class); 

    //查询条件
    List<Predicate> predicates = new ArrayList<Predicate>(); 

    if (null != isEnabled) {
      Predicate predicate = criteriaBuilder.equal(rootFrom.get("isEnabled").as(Integer.class), isEnabled);
      predicates.add(predicate); 

    } 

    //格式化参数
    criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]))); 

    //默认按照id排序(从小到大)
    criteriaQuery.orderBy(criteriaBuilder.asc(rootFrom.get("id"))); 

    //SQL查询对象
    TypedQuery<CameraInfoPO> createQuery = em.createQuery(criteriaQuery); 

    //分页参数
    Integer pageSize = pageable.getPageSize();
    Integer pageNo = pageable.getPageNumber(); 

    //计数查询结果条数
    TypedQuery<CameraInfoPO> createCountQuery = em.createQuery(criteriaQuery); 

    // 实际查询返回分页对象
    int startIndex = pageSize * pageNo;
    createQuery.setFirstResult(startIndex);
    createQuery.setMaxResults(pageable.getPageSize());
    Page<CameraInfoPO> pageRst =
      new PageImpl<CameraInfoPO>(createQuery.getResultList(), pageable, createCountQuery.getResultList().size());
    return pageRst; 

  } 

  //制造查询条件结果(建议存放map)
  private Specification<CameraInfoPO> getWhereClause(final Integer isEnabled) {
    return new Specification<CameraInfoPO>() {
      public Predicate toPredicate(Root<CameraInfoPO> r, CriteriaQuery<?> q, CriteriaBuilder cb) {
        Predicate predicate = cb.conjunction();
        if (null != isEnabled) { 

          predicate = cb.equal(r.get("isEnabled").as(Integer.class), isEnabled);
        } 

        return predicate;
      }
    };
  } 

  //单表根据查询条件的分页
  public Page<CameraInfoPO> findCameraInfoByPageForJpa(Pageable pageable, Integer isEnabled) { 

    Specification<CameraInfoPO> spec = getWhereClause(isEnabled); 

    Page<CameraInfoPO> pageRst = cameraInfoRepo.findAll(spec, pageable); 

    return pageRst; 

  } 

}

还有另外一种就更简单了,如果只是根据表里面的一个或者几个字段,可以直接写jpa实现,不用复杂

Pageable pageable = new PageRequest(1, 1);
Page<CameraInfoPO> page = cameraInfoRepo.findByIsEnabled(1, pageable); 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询

    前言 基于SpringMVC+Bootstrap+DataTables实现数据表格服务端分页.模糊查询(非DataTables Search),页面异步刷新. 说明:sp:message标签是使用了SpringMVC国际化 效果 DataTable表格 关键字查询 自定义关键字查询,非DataTable Search 代码 HTML代码 查询条件代码 <!-- 查询.添加.批量删除.导出.刷新 --> <div class="row-fluid"> <di

  • Spring Data JPA 复杂/多条件组合分页查询

    话不多说,请看代码: public Map<String, Object> getWeeklyBySearch(final Map<String, String> serArgs, String pageNum, String pageSize) throws Exception { // TODO Auto-generated method stub Map<String,Object> resultMap=new HashMap<String, Object&

  • springmvc 分页查询的简单实现示例代码

    目前较常用的分页实现办法有两种: 1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示. 2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数据并显示. 对于数据量并不大的简单的管理系统而言,第一种实现方法相对来说容易使用较少的代码实现分页这一功能,本文也正是为大家介绍这种方法: 代码片段: 1,Page.java package com.cm.contract.common; import org.apache.commons.lang.Strin

  • springboot用thymeleaf模板的paginate分页完整代码

    本文根据一个简单的user表为例,展示 springboot集成mybatis,再到前端分页完整代码(新手自学,不足之处欢迎纠正): 先看java部分 pom.xml 加入 <!--支持 Web 应用开发,包含 Tomcat 和 spring-mvc. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web&l

  • Java简单实现SpringMVC+MyBatis分页插件

    1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID

  • SpringMvc+Mybatis+Pagehelper分页详解

    最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现PageHelper比较合适 故写一篇从零开始的PageHelper使用的教程,也记录下忙活一天的东西 1.首先需要在项目中添加PageHelper的依赖,这里我用的Maven添加 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>

  • Spring MVC结合Spring Data JPA实现按条件查询和分页

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有. 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 (实现方法主要在SbglServiceImpl.java类中) 前台表现:用kkpaper表现出来 实现效果: 1.实体类 package com.jinhetech.yogurt.sbgl.entity; im

  • struts2+spring+hibernate分页代码[比较多]第1/7页

    dao层接口: Java代码 复制代码 代码如下: package com.last999.im.news.dao; import java.util.*; import com.last999.im.news.entity.KindEntity; import com.last999.im.news.web.PageTool; public interface KindEntityDao{ public KindEntity get(String uuid); public void save

  • SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例

    今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能. 下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): public List<User> findByHeightAndSex(int height,char sex); // Or --- 等价于 SQL 中的 or 关键字,比如 findByHei

  • Spring Data JPA实现分页Pageable的实例代码

    在JPA中提供了很方便的分页功能,那就是Pageable(org.springframework.data.domain.Pageable)以及它的实现类PageRequest(org.springframework.data.domain.PageRequest),详细的可以见示例代码. 1.改变CustomerRepository方法​ /** * 一个参数,匹配两个字段 * @param name2 * @Param pageable 分页参数 * @return * 这里Param的值和

随机推荐