平時在寫一些小項目時,比較喜歡引用 Spring Data Jpa,其實仍是圖他寫代碼快~
在平常的開發工做中,分頁列表查詢基本是隨處可見,下面一塊兒看一下如何使用 jpa 進行多條件查詢以及查詢列表分頁呢?java
關於 jpa 的使用,下面2步簡單過一下,詳細資料,小夥伴自行搜索一下吧~mysql
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
mysql、web、druid......
</dependency>
圖方便直接貼代碼了:web
spring:
# 數據源
datasource:
url: jdbc:mysql://127.0.0.1:3306/tmax?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 1234
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
jpa:
# 操做數據庫時顯示sql語句
show-sql: true
# 自動生成表結構
generate-ddl: true
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.MySQL57Dialect
咱們瞭解 jpa 基本是不用去寫 sql 的,繼承 JpaRepository 便可,一樣也提供給了咱們分頁查詢的方法:spring
舉例:sql
Page<VideoCategory> findByCondition(SearchVo searchVo, Pageable pageable);
經過傳入一個遵循 pageale 協議的對象來獲取某一頁的數據,經過源碼查看,發現 Pageable 是一個接口,提供了分頁一組方法的聲明,如第幾頁,每頁多少條記錄,排序信息等,部分方法以下:數據庫
int getPageNumber();
int getPageSize();
int getOffset();
Sort getSort();
Pageable next();
Pageable previousOrFirst();
Pageable first();
boolean hasPrevious();
經過這些方法咱們能夠構造咱們的 pageable 對象,須要注意的是 jpa 在構造頁碼初始時,是從 0 開始的。微信
廢話很少說,來看一段代碼吧:app
@Override
public Page<VideoCategory> findByCondition(VideoCategory videoCategory, SearchVo searchVo, Pageable pageable) {
return videoCategoryDao.findAll(new Specification<VideoCategory>() {
@Nullable
@Override
public Predicate toPredicate(Root<VideoCategory> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
// 可添加你的其餘搜索過濾條件 默認已有建立時間過濾
Path<Date> createTimeField=root.get("createTime");
Path<String> categoryIdField=root.get("categoryId");
List<Predicate> list = new ArrayList<Predicate>();
//建立時間
if(StrUtil.isNotBlank(searchVo.getStartDate())&&StrUtil.isNotBlank(searchVo.getEndDate())){
Date start = DateUtil.parse(searchVo.getStartDate());
Date end = DateUtil.parse(searchVo.getEndDate());
list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end)));
}
// 視頻分類
if(StrUtil.isNotBlank(videoCategory.getCategoryId())){
list.add(cb.equal(categoryIdField,videoCategory.getCategoryId()));
}
Predicate[] arr = new Predicate[list.size()];
cq.where(list.toArray(arr));
return null;
}
}, pageable);
}
@RequestMapping(value = "/getByCondition", method = RequestMethod.GET)
@ApiOperation(value = "多條件分頁獲取")
public Result<Page<VideoCategory>> getByCondition(
@ModelAttribute VideoCategory videoCategory,
@ModelAttribute SearchVo searchVo,
@ModelAttribute PageVo pageVo){
Page<VideoCategory> page = videoCategoryService.findByCondition(videoCategory, searchVo, PageUtil.initPage(pageVo));
return new ResultUtil<Page<VideoCategory>>().setData(page);
}
public static Pageable initPage(PageVo page){
Pageable pageable = null;
int pageNumber = page.getPageNumber();
int pageSize = page.getPageSize();
String sort = page.getSort();
String order = page.getOrder();
if(pageNumber<1){
pageNumber = 1;
}
if(pageSize<1){
pageSize = 10;
}
if(StrUtil.isNotBlank(sort)) {
Sort.Direction d;
if(StrUtil.isBlank(order)) {
d = Sort.Direction.DESC;
} else {
d = Sort.Direction.valueOf(order.toUpperCase());
}
Sort s = new Sort(d, sort);
pageable = PageRequest.of(pageNumber-1, pageSize, s);
} else {
pageable = PageRequest.of(pageNumber-1, pageSize);
}
return pageable;
}
若是文章有錯的地方歡迎指正,你們互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:niceyooide