JPA Specification常用查詢+排序?qū)嵗?/h1>
更新時間:2021年11月18日 15:17:41 作者:afaye_
這篇文章主要介紹了JPA Specification常用查詢+排序?qū)嵗哂泻芎玫膮⒖純r值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
JPA Specification常用查詢+排序
1.第一步:繼承父類
public interface TblCarton2RCardLogRepository extends JpaRepository<TblCarton2RCardLog, String>,JpaSpecificationExecutor<TblCarton2RCardLog> {
2.第二步
tblCarton2RCardLogRepository.findAll(new Specification<TblCarton2RCardLog>() {
@Override
public Predicate toPredicate(Root<TblCarton2RCardLog> root, CriteriaQuery<?> query,CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("cartonNo").as(String.class), cartonNo));//某普通字段
list.add(cb.equal(root.get("id").get("rCard").as(String.class), rCard));//主鍵中某字段
list.add(cb.like(root.get("mocode").as(String.class), "%" + mocode + "%"));//like
list.add(cb.between(root.get("frozenDate").as(Long.class), frozenDateStart, frozenDateEnd));//between and
list.add(cb.greaterThanOrEqualTo(root.get("id").get("rcard").as(String.class), rCardStart));//大于等于
list.add(root.get("id").get("lotNo").as(String.class).in(lotNos));//in
//ORDER BY packdate DESC,packtime DESC
Predicate[] p = new Predicate[list.size()];
query.where(cb.and(list.toArray(p)));
query.orderBy(cb.desc(root.get("packDate")),cb.desc(root.get("packTime")));
return query.getRestriction();
}
});
JPA Specification復(fù)雜查詢+排序
剛使用spring-data-jpa,遇到不少難題,網(wǎng)上查了很多資料,發(fā)現(xiàn)講jpa的不多,發(fā)個我剛做過的接口的過程吧。
需求

看到圖了嗎?需要實現(xiàn)搜索以及各種字段的排序還要分頁,還有可能有選擇各種條件的下拉列表,是不是很變態(tài)?
開始了
1.dao
需要先處理dao層,這里喜歡叫repository。做一個實體類的dao層接口,繼承JpaSpecificationExecutor,再寫一個查詢接口。

2.service

在這里主要處理的是查詢條件,我這里是搜索功能的模糊查詢,當(dāng)然如果有更多的查詢也可以添加進(jìn)這里。這里需要注意的是specification。
3.排序
需要先建一個輔助的實體類,屬性名我取和需要排序的實體類一樣的名字,但是注意屬性都是String類型的啊。后面細(xì)說,先上我建的輔助類。
@Data
public class DeptSort {
private String id;//編碼
private String name;//名稱
private String highDeptName;//上級部門
private String principal;//負(fù)責(zé)人
private String deptType;//部門類型
private String enable;//啟用
}
字段都是需要排序的字段,這是為了好區(qū)分,叫別的也可以。
下面是controller層,排序功能的具體實現(xiàn)。
public ResponseModel table(@RequestParam("search")String search,
@RequestParam("pageNumber")Integer pageNumber,
@RequestParam("pageSize")Integer pageSize,
@RequestBody DeptSort deptSort){
ResponseModel model = null;
try {
List<Sort.Order> orders = new ArrayList<Sort.Order>();
if (StringUtils.isNotBlank(deptSort.getId())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getId()),"id"));
}
if (StringUtils.isNotBlank(deptSort.getName())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getName()),"name"));
}
if (StringUtils.isNotBlank(deptSort.getHighDeptName())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getHighDeptName()),"highDeptName"));
}
if (StringUtils.isNotBlank(deptSort.getPrincipal())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getPrincipal()),"principal"));
}
if (StringUtils.isNotBlank(deptSort.getDeptType())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getDeptType()),"deptType"));
}
if (StringUtils.isNotBlank(deptSort.getEnable())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"));
}
//orders不能為空,所以如果為空設(shè)置按id排序[/code][code] if (orders.size() == 0){
orders.add(new Sort.Order(Sort.Direction.ASC,"id"));
}
Sort sort = new Sort(orders);
Pageable pageable = new PageRequest(pageNumber,pageSize,sort);
Page<Businessdept> all = service.findAll(search, pageable);
model = ResponseModel.getSuccessResponseModel().setData(all);
}catch (Exception e){
e.printStackTrace();
model = ResponseModel.getFailedResponseModel();
}
return model;
}
需要的參數(shù)有搜索內(nèi)容search,還有DeptSort輔助類。首先建立
List<Sort.Order> orders = new ArrayList<Sort.Order>();
集合,然后if判斷將參數(shù)加入集合。
需要說明的是類似
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"))
語句,“enable”是需要查詢的Businessdept里的字段,不是輔助類的,當(dāng)然這里我的輔助類和Businessdept類一致,但是不一樣的同學(xué)需要注意了。
前端
對于前端傳遞的參數(shù)有什么要求呢?

deptSort的各個屬性的參數(shù)只能限定兩種asc和desc,即升序和降序。上圖的功能需求只需要傳deptSort里的一個屬性就可以了,這里傳兩個參數(shù)演示一下。
查詢成功的數(shù)據(jù)不展示了,給大家看一個后臺的SQL語句
Hibernate:
/* select
count(generatedAlias0)
from
Businessdept as generatedAlias0
where
(
generatedAlias0.name like :param0
)
and (
generatedAlias0.deleteIs=1
) */ select
count(businessde0_.id) as col_0_0_
from
t_department businessde0_
where
(
businessde0_.name like ?
)
and businessde0_.delete_is=1
Hibernate:
/* select
generatedAlias0
from
Businessdept as generatedAlias0
where
(
generatedAlias0.name like :param0
)
and (
generatedAlias0.deleteIs=1
)
order by
generatedAlias0.deptType asc,
generatedAlias0.enable desc */ select
businessde0_.id as id1_3_,
businessde0_.delete_is as delete_i2_3_,
businessde0_.dept_type as dept_typ3_3_,
businessde0_.enable as enable4_3_,
businessde0_.high_dept_id as high_dep5_3_,
businessde0_.high_dept_name as high_dep6_3_,
businessde0_.name as name7_3_,
businessde0_.principal as principa8_3_
from
t_department businessde0_
where
(
businessde0_.name like ?
)
and businessde0_.delete_is=1
order by
businessde0_.dept_type asc,
businessde0_.enable desc limit ?
可以看到條件查詢,升序、降序都有。
結(jié)束語
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
SpringBoot與velocity的結(jié)合的示例代碼
本篇文章主要介紹了SpringBoot與velocity的結(jié)合的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 2018-03-03
-
Mybatis中resultMap的Colum和property屬性詳解
這篇文章主要介紹了Mybatis中resultMap的Colum和property屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。 2022-01-01
-
spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀
這篇文章主要介紹了spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教 2022-11-11
-
詳解Spring-bean的循環(huán)依賴以及解決方式
這篇文章主要介紹了詳解Spring-bean的循環(huán)依賴以及解決方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 2018-09-09
最新評論
JPA Specification常用查詢+排序
1.第一步:繼承父類
public interface TblCarton2RCardLogRepository extends JpaRepository<TblCarton2RCardLog, String>,JpaSpecificationExecutor<TblCarton2RCardLog> {
2.第二步
tblCarton2RCardLogRepository.findAll(new Specification<TblCarton2RCardLog>() { @Override public Predicate toPredicate(Root<TblCarton2RCardLog> root, CriteriaQuery<?> query,CriteriaBuilder cb) { List<Predicate> list = new ArrayList<Predicate>(); list.add(cb.equal(root.get("cartonNo").as(String.class), cartonNo));//某普通字段 list.add(cb.equal(root.get("id").get("rCard").as(String.class), rCard));//主鍵中某字段 list.add(cb.like(root.get("mocode").as(String.class), "%" + mocode + "%"));//like list.add(cb.between(root.get("frozenDate").as(Long.class), frozenDateStart, frozenDateEnd));//between and list.add(cb.greaterThanOrEqualTo(root.get("id").get("rcard").as(String.class), rCardStart));//大于等于 list.add(root.get("id").get("lotNo").as(String.class).in(lotNos));//in //ORDER BY packdate DESC,packtime DESC Predicate[] p = new Predicate[list.size()]; query.where(cb.and(list.toArray(p))); query.orderBy(cb.desc(root.get("packDate")),cb.desc(root.get("packTime"))); return query.getRestriction(); } });
JPA Specification復(fù)雜查詢+排序
剛使用spring-data-jpa,遇到不少難題,網(wǎng)上查了很多資料,發(fā)現(xiàn)講jpa的不多,發(fā)個我剛做過的接口的過程吧。
需求
看到圖了嗎?需要實現(xiàn)搜索以及各種字段的排序還要分頁,還有可能有選擇各種條件的下拉列表,是不是很變態(tài)?
開始了
1.dao
需要先處理dao層,這里喜歡叫repository。做一個實體類的dao層接口,繼承JpaSpecificationExecutor,再寫一個查詢接口。
2.service
在這里主要處理的是查詢條件,我這里是搜索功能的模糊查詢,當(dāng)然如果有更多的查詢也可以添加進(jìn)這里。這里需要注意的是specification。
3.排序
需要先建一個輔助的實體類,屬性名我取和需要排序的實體類一樣的名字,但是注意屬性都是String類型的啊。后面細(xì)說,先上我建的輔助類。
@Data public class DeptSort { private String id;//編碼 private String name;//名稱 private String highDeptName;//上級部門 private String principal;//負(fù)責(zé)人 private String deptType;//部門類型 private String enable;//啟用 }
字段都是需要排序的字段,這是為了好區(qū)分,叫別的也可以。
下面是controller層,排序功能的具體實現(xiàn)。
public ResponseModel table(@RequestParam("search")String search, @RequestParam("pageNumber")Integer pageNumber, @RequestParam("pageSize")Integer pageSize, @RequestBody DeptSort deptSort){ ResponseModel model = null; try { List<Sort.Order> orders = new ArrayList<Sort.Order>(); if (StringUtils.isNotBlank(deptSort.getId())){ orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getId()),"id")); } if (StringUtils.isNotBlank(deptSort.getName())){ orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getName()),"name")); } if (StringUtils.isNotBlank(deptSort.getHighDeptName())){ orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getHighDeptName()),"highDeptName")); } if (StringUtils.isNotBlank(deptSort.getPrincipal())){ orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getPrincipal()),"principal")); } if (StringUtils.isNotBlank(deptSort.getDeptType())){ orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getDeptType()),"deptType")); } if (StringUtils.isNotBlank(deptSort.getEnable())){ orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable")); } //orders不能為空,所以如果為空設(shè)置按id排序[/code][code] if (orders.size() == 0){ orders.add(new Sort.Order(Sort.Direction.ASC,"id")); } Sort sort = new Sort(orders); Pageable pageable = new PageRequest(pageNumber,pageSize,sort); Page<Businessdept> all = service.findAll(search, pageable); model = ResponseModel.getSuccessResponseModel().setData(all); }catch (Exception e){ e.printStackTrace(); model = ResponseModel.getFailedResponseModel(); } return model; }
需要的參數(shù)有搜索內(nèi)容search,還有DeptSort輔助類。首先建立
List<Sort.Order> orders = new ArrayList<Sort.Order>();
集合,然后if判斷將參數(shù)加入集合。
需要說明的是類似
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"))
語句,“enable”是需要查詢的Businessdept里的字段,不是輔助類的,當(dāng)然這里我的輔助類和Businessdept類一致,但是不一樣的同學(xué)需要注意了。
前端
對于前端傳遞的參數(shù)有什么要求呢?
deptSort的各個屬性的參數(shù)只能限定兩種asc和desc,即升序和降序。上圖的功能需求只需要傳deptSort里的一個屬性就可以了,這里傳兩個參數(shù)演示一下。
查詢成功的數(shù)據(jù)不展示了,給大家看一個后臺的SQL語句
Hibernate: /* select count(generatedAlias0) from Businessdept as generatedAlias0 where ( generatedAlias0.name like :param0 ) and ( generatedAlias0.deleteIs=1 ) */ select count(businessde0_.id) as col_0_0_ from t_department businessde0_ where ( businessde0_.name like ? ) and businessde0_.delete_is=1 Hibernate: /* select generatedAlias0 from Businessdept as generatedAlias0 where ( generatedAlias0.name like :param0 ) and ( generatedAlias0.deleteIs=1 ) order by generatedAlias0.deptType asc, generatedAlias0.enable desc */ select businessde0_.id as id1_3_, businessde0_.delete_is as delete_i2_3_, businessde0_.dept_type as dept_typ3_3_, businessde0_.enable as enable4_3_, businessde0_.high_dept_id as high_dep5_3_, businessde0_.high_dept_name as high_dep6_3_, businessde0_.name as name7_3_, businessde0_.principal as principa8_3_ from t_department businessde0_ where ( businessde0_.name like ? ) and businessde0_.delete_is=1 order by businessde0_.dept_type asc, businessde0_.enable desc limit ?
可以看到條件查詢,升序、降序都有。
結(jié)束語
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot與velocity的結(jié)合的示例代碼
本篇文章主要介紹了SpringBoot與velocity的結(jié)合的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Mybatis中resultMap的Colum和property屬性詳解
這篇文章主要介紹了Mybatis中resultMap的Colum和property屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀
這篇文章主要介紹了spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11詳解Spring-bean的循環(huán)依賴以及解決方式
這篇文章主要介紹了詳解Spring-bean的循環(huán)依賴以及解決方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09