javascript
long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)
在我們平時的工作中,查詢列表在我們的系統中基本隨處可見,那么我們如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。
1、引入起步依賴
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-data-jpa
2、對thymeleaf和jpa進行配置
打開application.yml,添加以下參數,以下配置在之前的文章中介紹過,此處不做過多說明
spring:
thymeleaf:
cache:truecheck-template-location: truecontent-type: text/html
enabled:trueencoding: utf-8mode: HTML5
prefix: classpath:/templates/suffix: .html
excluded-view-names:
template-resolver-order:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/restful?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root
initialize:trueinit-db: truejpa:
database: mysql
show-sql: truehibernate:
ddl-auto: update
naming:
strategy: org.hibernate.cfg.ImprovedNamingStrategy
3、編寫實體Bean
@Entity
@Table(name="book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Long id;
@Column(nullable = false,name = "name")
private String name;
@Column(nullable = false,name = "isbn")
private String isbn;
@Column(nullable = false,name = "author")
private String author;
public Book (String name,String isbn,String author){
this.name = name;
this.isbn = isbn;
this.author = author;
}
public Book(){
}
//此處省去get、set方法
}
public class BookQuery {
private String name;
private String isbn;
private String author;
//此處省去get、set方法
}
4、編寫Repository接口
@Repository("bookRepository")
public interface BookRepository extends JpaRepository
,JpaSpecificationExecutor {
}
此處繼承了兩個接口,后續會介紹為何會繼承這兩個接口
5、抽象service層
首先抽象出接口
public interface BookQueryService {
Page findBookNoCriteria(Integer page,Integer size);
Page findBookCriteria(Integer page,Integer size,BookQuery bookQuery);
}
實現接口
@Service(value="https://my.oschina.net/wangxincj/blog/bookQueryService")
public class BookQueryServiceImpl implements BookQueryService {
@Resource
BookRepository bookRepository;
@Override
public Page findBookNoCriteria(Integer page,Integer size) {
Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, "id");
return bookRepository.findAll(pageable);
}
@Override
public Page findBookCriteria(Integer page, Integer size, final BookQuery bookQuery) {
Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, "id");
Page bookPage = bookRepository.findAll(new Specification(){
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder criteriaBuilder) {
List list = new ArrayList();
if(null!=bookQuery.getName()&&!"".equals(bookQuery.getName())){
list.add(criteriaBuilder.equal(root.get("name").as(String.class), bookQuery.getName()));
}
if(null!=bookQuery.getIsbn()&&!"".equals(bookQuery.getIsbn())){
list.add(criteriaBuilder.equal(root.get("isbn").as(String.class), bookQuery.getIsbn()));
}
if(null!=bookQuery.getAuthor()&&!"".equals(bookQuery.getAuthor())){
list.add(criteriaBuilder.equal(root.get("author").as(String.class), bookQuery.getAuthor()));
}
Predicate[] p = new Predicate[list.size()];
return criteriaBuilder.and(list.toArray(p));
}
},pageable);
return bookPage;
}
}
此處我定義了兩個接口,findBookNoCriteria是不帶查詢條件的,findBookCriteria是帶查詢條件的。在此處介紹一下上面提到的自定義Repository繼承的兩個接口,如果你的查詢列表是沒有查詢條件,只是列表展示和分頁,只需繼承JpaRepository接口即可,但是如果你的查詢列表是帶有多個查詢條件的話則需要繼承JpaSpecificationExecutor接口,這個接口里面定義的多條件查詢的方法。當然不管繼承哪個接口,當你做分頁查詢時,都是需要調用findAll方法的,這個方法是jap定義好的分頁查詢方法。
findBookCriteria方法也可以使用以下方法實現,大家可以自行選擇
@Override
public Page findBookCriteria(Integer page, Integer size, final BookQuery bookQuery) {
Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, "id");
Page bookPage = bookRepository.findAll(new Specification(){
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder criteriaBuilder) {
Predicate p1 = criteriaBuilder.equal(root.get("name").as(String.class), bookQuery.getName());
Predicate p2 = criteriaBuilder.equal(root.get("isbn").as(String.class), bookQuery.getIsbn());
Predicate p3 = criteriaBuilder.equal(root.get("author").as(String.class), bookQuery.getAuthor());
query.where(criteriaBuilder.and(p1,p2,p3));
return query.getRestriction();
}
},pageable);
return bookPage;
}
6、編寫Controller
針對有查詢條件和無查詢條件,我們分別編寫一個Controller,默認每頁顯示5條,如下
@Controller
@RequestMapping(value = "https://my.oschina.net/queryBook")
public class BookController {
@Autowired
BookQueryService bookQueryService;
@RequestMapping("/findBookNoQuery")
public String findBookNoQuery(ModelMap modelMap,@RequestParam(value = "https://my.oschina.net/wangxincj/blog/page", defaultValue = "https://my.oschina.net/wangxincj/blog/0") Integer page,
@RequestParam(value = "https://my.oschina.net/wangxincj/blog/size", defaultValue = "https://my.oschina.net/wangxincj/blog/5") Integer size){
Page datas = bookQueryService.findBookNoCriteria(page, size);
modelMap.addAttribute("datas", datas);
return "index1";
}
@RequestMapping(value = "https://my.oschina.net/findBookQuery",method = {RequestMethod.GET,RequestMethod.POST})
public String findBookQuery(ModelMap modelMap, @RequestParam(value = "https://my.oschina.net/wangxincj/blog/page", defaultValue = "https://my.oschina.net/wangxincj/blog/0") Integer page,
@RequestParam(value = "https://my.oschina.net/wangxincj/blog/size", defaultValue = "https://my.oschina.net/wangxincj/blog/5") Integer size, BookQuery bookQuery){
Page datas = bookQueryService.findBookCriteria(page, size,bookQuery);
modelMap.addAttribute("datas", datas);
return "index2";
}
}
7、編寫頁面
首先我們編寫一個通用的分頁頁面,新建一個叫page.html的頁面
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="page">
- 首頁
- 上一頁
針對無查詢條件的接口,創建一個名為index1.html的頁面并引入之前寫好的分頁頁面,如下
TitleIDnameisbnauthor
${obj.id}${obj.name}${obj.isbn}${obj.author}針對有查詢條件的接口,創建一個名為index2.html的頁面并引入之前寫好的分頁頁面,如下
Title name isbn author 查詢| ${obj.id} | ${obj.name} | ${obj.isbn} | ${obj.author} |
ok!代碼都已經完成,我們將項目啟動起來,看一下效果。大家可以往數據庫中批量插入一些數據,訪問http://localhost:8080/queryBook/findBookNoQuery,顯示如下頁面
訪問http://localhost:8080/queryBook/findBookQuery,顯示頁面如下,可以輸入查詢條件進行帶條件的分頁查詢:
ok!以上便是一個簡單的jap分頁查詢功能的實現。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 分布式数据库查询,分布式数据库
- 下一篇: js立即执行函数_《JS 函数的执行时机