spring data jpa分页查询示例代码

yizhihongxing

下面是 Spring Data JPA 分页查询示例代码的详细攻略。

1. 整体思路

Spring Data JPA 分页查询主要涉及到以下几个方面的内容:

  1. 数据库表的建立
  2. 实体类的定义和映射
  3. Spring Data JPA 的依赖导入
  4. DAO 接口和实现类的定义
  5. 分页查询方法的定义和实现
  6. 控制器方法的编写

其中,数据库表的建立和实体类的定义和映射这两个方面在此不做过多讲解,重点介绍后面几个方面的内容。

2. Spring Data JPA 的依赖导入

首先需要在项目的 pom.xml 文件中添加 Spring Data JPA 的依赖,示例代码如下:

<!-- Spring Data JPA 依赖 -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency>

3. DAO 接口和实现类的定义

接下来,需要定义 DAO 接口和实现类。DAO 接口中定义分页查询方法的签名,具体的实现则交给实现类来完成。示例代码如下:

public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 分页查询用户信息
     *
     * @param pageable 分页信息
     * @return 用户信息列表
     */
    Page<User> findAll(Pageable pageable);

}
@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    @Override
    public Page<User> findUserByPage(Pageable pageable) {
        String hql = "FROM User";
        Query query = entityManager.createQuery(hql);
        query.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize());
        query.setMaxResults(pageable.getPageSize());
        List<User> list = query.getResultList();
        int total = entityManager.createQuery("SELECT COUNT(*) FROM User").getSingleResult().intValue();
        return new PageImpl<>(list, pageable, total);
    }

}

需要注意的是,分页查询方法的返回值类型为 Page 类型,其中包含分页信息和查询结果。

4. 分页查询方法的定义和实现

在 DAO 接口中定义了分页查询方法后,需要在实现类中具体实现。

可以使用 entityManager 自己写 hql 语句进行查询,也可以直接使用 Spring Data JPA 提供的方法来实现。下面分别给出两个示例代码。

使用 entityManager 实现分页查询方法

@Override
public Page<User> findUserByPage(Pageable pageable) {
    String hql = "FROM User";
    Query query = entityManager.createQuery(hql);
    query.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize());
    query.setMaxResults(pageable.getPageSize());
    List<User> list = query.getResultList();
    int total = entityManager.createQuery("SELECT COUNT(*) FROM User").getSingleResult().intValue();
    return new PageImpl<>(list, pageable, total);
}

使用 Spring Data JPA 提供的方法实现分页查询

@Override
public Page<User> findAll(Pageable pageable) {
    return userRepository.findAll(pageable);
}

5. 控制器方法的编写

最后,在控制器中定义分页查询方法的映射,并实现具体操作。示例代码如下:

@GetMapping("/users")
public String list(Model model, @RequestParam(value = "page", defaultValue = "1") Integer pageNum,
                   @RequestParam(value = "size", defaultValue = "5") Integer pageSize) {
    Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
    Page<User> page = userRepository.findAll(pageable);
    model.addAttribute("page", page);
    return "user/list";
}

其中,PageRequest 是 Spring Data JPA 中提供的分页请求实体类,通过它可以设置分页查询的页码和每页大小。在控制器方法中得到分页请求实例后,调用 DAO 中定义的分页查询方法,得到分页查询结果后,将其添加到模型参数中,最后返回视图页面进行展示。

6. 示例代码

综上所述,下面给出 Spring Data JPA 分页查询示例代码:

【示例一】使用 entityManager 实现分页查询方法

UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 分页查询用户信息
     *
     * @param pageable 分页信息
     * @return 用户信息列表
     */
    Page<User> findAll(Pageable pageable);

}

UserRepositoryImpl.java

@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    @Override
    public Page<User> findUserByPage(Pageable pageable) {
        String hql = "FROM User";
        Query query = entityManager.createQuery(hql);
        query.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize());
        query.setMaxResults(pageable.getPageSize());
        List<User> list = query.getResultList();
        int total = entityManager.createQuery("SELECT COUNT(*) FROM User").getSingleResult().intValue();
        return new PageImpl<>(list, pageable, total);
    }

}

【示例二】使用 Spring Data JPA 提供的方法实现分页查询

UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 分页查询用户信息
     *
     * @param pageable 分页信息
     * @return 用户信息列表
     */
    Page<User> findAll(Pageable pageable);

}

控制器方法

@GetMapping("/users")
public String list(Model model, @RequestParam(value = "page", defaultValue = "1") Integer pageNum,
                   @RequestParam(value = "size", defaultValue = "5") Integer pageSize) {
    Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
    Page<User> page = userRepository.findAll(pageable);
    model.addAttribute("page", page);
    return "user/list";
}

以上就是关于 Spring Data JPA 分页查询示例代码的详细攻略。希望能对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring data jpa分页查询示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • JAVA实现按时间段查询数据操作

    JAVA实现按时间段查询数据操作的完整攻略如下: 步骤一:连接数据库 首先,需要在Java代码中连接到数据库。一般使用JDBC驱动连接数据库。以下是连接MySQL数据库的示例代码: import java.sql.*; public class MySqlDatabase { private static final String DRIVER_NAME =…

    Java 2023年5月20日
    00
  • shell脚本监控MySQL服务是否正常

    下面就详细说明如何编写一个shell脚本来监控MySQL服务是否正常。 1. 编写脚本 首先可以使用vim等编辑器创建一个名为mysql_monitor.sh的文件,并在开头添加如下内容: #!/bin/bash #指明使用bash解释器 MYSQL=`which mysql` #获取mysql命令路径 MYSQL_CONF=/etc/my.cnf #mys…

    Java 2023年6月15日
    00
  • Java8 Stream 流常用方法合集

    Java8 Stream 流常用方法合集 Java 8 引入了一种新的抽象数据类型 Stream,它让数据的操作变得更加简单高效。Stream 可以是一组数据的集合、数组等等,它支持多方面的操作,比如过滤、映射、筛选、分组、去重、排序等等。下面将介绍 Java8 Stream 常用的方法。 创建流 从集合创建流:可以将一个集合转换为流,并对流中的元素进行操作…

    Java 2023年5月26日
    00
  • 关于ArrayList初始化容量的问题

    关于ArrayList初始化容量的问题可以分成以下几个方面来讲解: 1. 初始化ArrayList对象 初始化一个ArrayList对象可以使用以下的代码: List<String> list = new ArrayList<>(); 上述代码将创建一个空的ArrayList对象。 2. 设置初始容量 在初始化ArrayList对象的…

    Java 2023年5月26日
    00
  • 基于自定义校验注解(controller、method、(groups)分组的使用)

    基于自定义校验注解的使用可以提高代码的可读性和可维护性,可以定义自己的业务规则并在控制器中进行验证,从而更好地保障数据的安全性。下面给出一个完整的攻略,包括自定义注解的编写、控制器中的使用、注解的分组以及两个示例。 编写自定义注解 自定义注解应该使用@Target和@Retention注解对其进行标记,使其可以被正确地应用到需要校验的方法上。下面是一个简单的…

    Java 2023年5月20日
    00
  • Java 数组高频考点分析讲解

    Java 数组高频考点分析讲解 数组是Java中非常重要的数据类型,经常被用于开发过程中。下面我们来详细讲解Java数组的高频考点,以帮助读者更好地掌握数组的使用。 数组概述 数组是一种存储同类型元素的数据结构,它是在程序中声明的一个固定大小的、连续存储的元素集合。在Java中,数组是一个对象,由一块连续的内存空间组成,可以存储多个相同数据类型的元素。 数组…

    Java 2023年5月26日
    00
  • Java MyBatis是如何执行一条SQL语句的

    Java MyBatis是一款ORM(Object-Relational Mapping)框架,它可以简化Java应用程序与关系型数据库的交互。MyBatis通过XML文件和Java注解描述SQL语句,然后在运行时执行这些语句并将结果映射为Java POJO对象。下面将详细讲解Java MyBatis如何执行一条SQL语句。 1.解析XML文件和注解 Jav…

    Java 2023年5月20日
    00
  • 基于php缓存的详解

    下面是基于PHP缓存的完整攻略: 什么是PHP缓存? PHP缓存是一种将PHP脚本解释成二进制代码并缓存在内存或者硬盘中,以便下次直接使用缓存结果的机制。由于PHP代码的解析、编译和执行比较耗时,所以使用缓存机制可以大大提高PHP程序的运行效率和响应速度。 常用的PHP缓存方式 1. APC缓存 APC(Alternative PHP Cache)是PHP官…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部