使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

本文介绍了Spring JPA中使用Page、Pageable和Sort进行分页排序的方法,包括PageRequest的用法,Page接口的常用方法,以及在实际项目中的应用。通过示例展示了如何在Spring Boot中实现分页查询,并提供了一个完整的Demo,涉及到JpaRepository、Marker实体类、Dao层接口、Service层接口及其实现、Controller层的处理。同时,文章还讨论了@Query注解的使用,以及Spring Data JPA中动态查询的方法。
摘要由CSDN通过智能技术生成

 

显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填。

但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size)

 

 

 

 

 

 

 分页是从第0也开始的

Spring项目使用JPA进行数据库操作可以极大的简化开发,下面我将用一个完整的Demo为大家展示分页查询并显示在前台页面
首先来说一下分页和排序所用到的Page、Pageable接口和Sort类都是什么

JpaRepository提供了两个和分页和排序有关的查询

List findAll(Sort sort)                      返回所有实体,按照指定顺序排序返回

List findAll(Pageable pageable)   返回实体列表,实体的offest和limit通过pageable来指定

Sort对象用来指示排序,最简单的Sort对象构造可以传入一个属性名列表(不是数据库列名,是属性名),默认采用升序排序。例:

Sort sort = new Sort("id");
//或 Sort sort = new Sort(Direction.ASC,"id");
return userDao.findAll(sort);
程序将查询所有user并按照id进行生序排序。Sort还包括其他一些构造方法,在这里就不一一赘述。

Pageable接口用于构造翻页查询,PageRequest是其实现类,可以通过提供的工厂方法创建PageRequest:

public static PageRequest of(int page, int size)
也可以在PageRequest中加入排序:

public static PageRequest of(int page, int size, Sort sort)
方法中的参数,page总是从0开始,表示查询页,size指每页的期望行数。

Page接口可以获得当前页面的记录、总页数、总记录数、是否有上一页或下一页等。Spring Data翻页查询总是返回Page对象,Page对象提供了以下常用的方法:

int getTotalPages() 总的页数
long getTotalElements() 返回总数
List getContent() 返回此次查询的结果集
代码实现:

1.建立SpringBoot工程,在pom.xml中添加以下依赖

<!--SpringMVC依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring JPA依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 连接mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.创建实体类

package org.gzc.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Marker {
@Id
@GeneratedValue
private int id;
private double lng;
private double lat;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getLng() {
return lng;
}
public void setLng(double lng) {
this.lng = lng;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
@Override
public String toString() {
return "Marker [id=" + id + ", lng=" + lng + ", lat=" + lat + "]";
}
}
3.编写dao层接口

package org.gzc.dao;

import org.gzc.entity.Marker;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MarkerDao extends JpaRepository<Marker, Integer>{

}
4.编写service层接口

package org.gzc.service;

import java.util.List;

import org.gzc.entity.Marker;
import org.springframework.data.domain.Pageable;


public interface MarkerService {
void saveMarker(Marker marker);
Page<Marker> findMarker(Pageable pageable);
}
5.编写service层实现类

package org.gzc.serviceimpl;

import java.util.List;

import org.gzc.dao.MarkerDao;
import org.gzc.entity.Marker;
import org.gzc.service.MarkerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
public class MarkerServiceImpl implements MarkerService{

@Autowired
private MarkerDao markerDao;
@Override
public void saveMarker(Marker marker) {
markerDao.save(marker);
}
@Override
public Page<Marker> findMarker(Pageable pageable) {
return markerDao.findAll(pageable);
}

}
6.编写controller

package org.gzc.controller;

import org.gzc.entity.Marker;
import org.gzc.service.MarkerService;
import org.gzc.util.Result;
import org.gzc.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MapHandlerController {
@Autowired
private MarkerService markerService;
@SuppressWarnings("rawtypes")
@PostMapping("/saveMarker")
public Result saveMarkerController(@RequestBody Marker marker){
System.out.println(marker);
if (marker!=null) {
markerService.saveMarker(marker);
return ResultUtil.success();
}
return ResultUtil.error(1, "保存失败", "/saveMarker");
}

@SuppressWarnings("rawtypes")
@GetMapping("/showMarkerCount")
public Result returnMarkerCount(){
long count = markerService.markerCount();
System.out.println("count------------------->"+count);
return ResultUtil.success(count, "/showMarkerCount");
}
@SuppressWarnings("rawtypes")
@GetMapping("/showMarkerByPage/{page}")
public Result showMarkerController(@PathVariable("page") int page){
PageRequest pageRequest = PageRequest.of(page, 5);
Page<Marker> markerPage = markerService.findMarker(pageRequest);
for (int i = 0; i < markerPage.getContent().size(); i++) {
System.out.println(markerPage.getContent().get(i));
System.out.println(markerPage.getTotalElements());
}
if (markerPage.getContent()!=null) {
return ResultUtil.success(markerPage.getContent(), "/showMarker");
}else {
return ResultUtil.error(1, "查询失败", "/showMarker");
}
}
}
后台先给前台传过去数据总量,前台计算完显示第几页,再将第几页传送给后台,后台进行查询并返回数据
---------------------
作者:来日可期
来源:CSDN
原文:https://blog.csdn.net/qq_40715775/article/details/83153808
版权声明:本文为博主原创文章,转载请附上博文链接!

 

springboot jpa 多条件查询(多表)

https://www.cnblogs.com/arrrrrya/p/7865090.html

 

2)在StudentService中findByDynamicCases()方法中具体的实现。这里先解释这几个对象是什么意思。

Specification:规则、标准。该对象主要是告诉JPA查询的过滤规则是什么。

Predicate:谓语、断言。该对象主要是定义具体的判断条件。如predicate1 = cb.like(sex,"男");即判断条件为性别为男性。

Root: Root<Student> root就是定义引用root指向Student的包装对象。Path<String> sex = root.get("sex");即通过root来获取Student的具体属性。

CriteriaQuery:查询条件的组装。query.where(predicate1,predicate2,predicate3);表示按条件predicate1 and predicate2 and predicate3进行组合条件查询。

CriteriaBuilder:用来构建CritiaQuery的构建器对象;如:predicate2 = cb.between(age,25,35);表示判断条件为Student.age between 25 and 25;

我这里的实现是为了演示基于JPA动态查询(性别为男,年龄在25-25之间,吴国人)我们具体该如何实现。很明显的看到这段代码把查询条件写死了,不易于扩展。通常情况下是把Specification定义为工具类,每一个判断条件Predicate定义为Spefication的一个方法,查询时再将不同的Predicate进行组装。有兴趣的可以自己实现。
---------------------
作者:_artoria_
来源:CSDN
原文:https://blog.csdn.net/UtopiaOfArtoria/article/details/78087494
版权声明:本文为博主原创文章,转载请附上博文链接!

 

@Query(value = "select * from xxx where if(?1 !='',x1=?1,1=1) and if(?2 !='',x2=?2,1=1)" +
"and if(?3 !='',x3=?3,1=1) ",nativeQuery = true)
List<XXX> find(String X1,String X2,String X3);
工作的时候需求有搜索功能,有三个参数,但是网上找了很多关于jpa多条件查询的代码要么在调dao的时候用了大量if判断,那么需要写很多查询方法,要么说的不知所云,我结合jpa和mysql原语句研究了半天才弄出了这个方法。

xxx是数据库表名,x1、x2、x3为查询的字段名。

下面的大写的XXX是实体类的名,X1X2X3为查询的参数。

if(?1 !='',x1=?1,1=1) 代表传入的参数X1如果不为""(Spring类型空是""而不是null)将参数传入x1,如果为空时显示1=1 代表参数为真,对查询结果不产生作用。
---------------------
作者:小宁萌的多肉
来源:CSDN
原文:https://blog.csdn.net/qq_36802726/article/details/81208853
版权声明:本文为博主原创文章,转载请附上博文链接!

这里,spring data jpa为我们提供了JpaSpecificationExecutor接口,只要简单实现toPredicate方法就可以实现复杂的查询


@Repository
public interface MonitorRepository extends JpaRepository<Monitor, Long>, JpaSpecificationExecutor {

}

ctrl类


@GetMapping("/api/listPage")
@ResponseBody
public Map<String, Object> listPage(@RequestParam(value = "pageNumber", defaultValue = "1") Integer pageNumber,
@RequestParam(value = "pageSize", defaultValue = "100") Integer pageSize,
@RequestParam("searchName") String searchName, @RequestParam("searchUrl") String searchUrl) {
//Pageable默认从0开始
pageNumber = pageNumber <= 0 ? 0 : pageNumber - 1;
Pageable pageable = new PageRequest(pageNumber, pageSize);
// Page<Monitor> monitorList = monitorRepository.findMonit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值