JPA Specification常用查詢+排序實例
https://www.jb51.net/article/229599.htm#_label1
JPA Specification常用查詢+排序
1.第一步:繼承父類
1
|
public
interface
TblCarton2RCardLogRepository
extends
JpaRepository<TblCarton2RCardLog, String>,JpaSpecificationExecutor<TblCarton2RCardLog> {
|
2.第二步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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復雜查詢+排序
剛使用spring-data-jpa,遇到不少難題,網上查了很多資料,發現講jpa的不多,發個我剛做過的接口的過程吧。
需求
看到圖了嗎?需要實現搜索以及各種字段的排序還要分頁,還有可能有選擇各種條件的下拉列表,是不是很變態?
開始了
1.dao
需要先處理dao層,這里喜歡叫repository。做一個實體類的dao層接口,繼承JpaSpecificationExecutor,再寫一個查詢接口。
2.service
在這里主要處理的是查詢條件,我這里是搜索功能的模糊查詢,當然如果有更多的查詢也可以添加進這里。這里需要注意的是specification。
3.排序
需要先建一個輔助的實體類,屬性名我取和需要排序的實體類一樣的名字,但是注意屬性都是String類型的啊。后面細說,先上我建的輔助類。
1
2
3
4
5
6
7
8
9
|
@Data
public
class
DeptSort {
private
String id;
//編碼
private
String name;
//名稱
private
String highDeptName;
//上級部門
private
String principal;
//負責人
private
String deptType;
//部門類型
private
String enable;
//啟用
}
|
字段都是需要排序的字段,這是為了好區分,叫別的也可以。
下面是controller層,排序功能的具體實現。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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不能為空,所以如果為空設置按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;
}
|
需要的參數有搜索內容search,還有DeptSort輔助類。首先建立
集合,然后if判斷將參數加入集合。
需要說明的是類似
語句,“enable”是需要查詢的Businessdept里的字段,不是輔助類的,當然這里我的輔助類和Businessdept類一致,但是不一樣的同學需要注意了。
前端
對於前端傳遞的參數有什么要求呢?
deptSort的各個屬性的參數只能限定兩種asc和desc,即升序和降序。上圖的功能需求只需要傳deptSort里的一個屬性就可以了,這里傳兩個參數演示一下。
查詢成功的數據不展示了,給大家看一個后台的SQL語句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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 ?
|
可以看到條件查詢,升序、降序都有。
結束語
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
<div class="art_xg">
<b>您可能感興趣的文章:</b><ul><li><a href="/article/198695.htm" title="Spring data jpa的使用與詳解(復雜動態查詢及分頁,排序)" target="_blank">Spring data jpa的使用與詳解(復雜動態查詢及分頁,排序)</a></li><li><a href="/article/111056.htm" title="Spring Data JPA 簡單查詢--方法定義規則(詳解)" target="_blank">Spring Data JPA 簡單查詢--方法定義規則(詳解)</a></li><li><a href="/article/175679.htm" title="Spring Data Jpa的四種查詢方式詳解" target="_blank">Spring Data Jpa的四種查詢方式詳解</a></li><li><a href="/article/110183.htm" title="Spring Data JPA實現動態查詢的兩種方法" target="_blank">Spring Data JPA實現動態查詢的兩種方法</a></li></ul>
</div>
</div>