下面是 Spring Data JPA 分页查询示例代码的详细攻略。
1. 整体思路
Spring Data JPA 分页查询主要涉及到以下几个方面的内容:
- 数据库表的建立
- 实体类的定义和映射
- Spring Data JPA 的依赖导入
- DAO 接口和实现类的定义
- 分页查询方法的定义和实现
- 控制器方法的编写
其中,数据库表的建立和实体类的定义和映射这两个方面在此不做过多讲解,重点介绍后面几个方面的内容。
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技术站