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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
| /**
* 動態查詢建構器
*/
@Component
public class UserPredicateBuilder {
private final QUser qUser = QUser.user;
private final QDepartment qDepartment = QDepartment.department;
/**
* 建構用戶查詢條件
*/
public BooleanBuilder buildUserPredicate(UserSearchCriteria criteria) {
BooleanBuilder builder = new BooleanBuilder();
// 基本欄位條件
addStringCondition(builder, qUser.username, criteria.getUsername(), StringMatchType.CONTAINS);
addStringCondition(builder, qUser.email, criteria.getEmail(), StringMatchType.CONTAINS);
addStringCondition(builder, qUser.firstName, criteria.getFirstName(), StringMatchType.CONTAINS);
addStringCondition(builder, qUser.lastName, criteria.getLastName(), StringMatchType.CONTAINS);
addStringCondition(builder, qUser.phone, criteria.getPhone(), StringMatchType.EXACT);
// 數值範圍條件
addRangeCondition(builder, qUser.age, criteria.getMinAge(), criteria.getMaxAge());
addRangeCondition(builder, qUser.salary, criteria.getMinSalary(), criteria.getMaxSalary());
// 枚舉條件
addEnumCondition(builder, qUser.status, criteria.getStatuses());
// 日期範圍條件
addDateRangeCondition(builder, qUser.createdAt, criteria.getCreatedAfter(), criteria.getCreatedBefore());
addDateRangeCondition(builder, qUser.updatedAt, criteria.getUpdatedAfter(), criteria.getUpdatedBefore());
// 關聯條件
addDepartmentConditions(builder, criteria);
return builder;
}
/**
* 字串條件處理
*/
private void addStringCondition(BooleanBuilder builder, StringPath path,
String value, StringMatchType matchType) {
if (value != null && !value.trim().isEmpty()) {
switch (matchType) {
case EXACT:
builder.and(path.eq(value));
break;
case CONTAINS:
builder.and(path.containsIgnoreCase(value.trim()));
break;
case STARTS_WITH:
builder.and(path.startsWithIgnoreCase(value.trim()));
break;
case ENDS_WITH:
builder.and(path.endsWithIgnoreCase(value.trim()));
break;
}
}
}
/**
* 數值範圍條件處理
*/
private <T extends Number & Comparable<T>> void addRangeCondition(
BooleanBuilder builder, NumberPath<T> path, T minValue, T maxValue) {
if (minValue != null) {
builder.and(path.goe(minValue));
}
if (maxValue != null) {
builder.and(path.loe(maxValue));
}
}
/**
* 枚舉條件處理
*/
private <T extends Enum<T>> void addEnumCondition(
BooleanBuilder builder, EnumPath<T> path, List<T> values) {
if (values != null && !values.isEmpty()) {
builder.and(path.in(values));
}
}
/**
* 日期範圍條件處理
*/
private void addDateRangeCondition(BooleanBuilder builder, DateTimePath<LocalDateTime> path,
LocalDateTime after, LocalDateTime before) {
if (after != null) {
builder.and(path.goe(after));
}
if (before != null) {
builder.and(path.loe(before));
}
}
/**
* 部門相關條件處理
*/
private void addDepartmentConditions(BooleanBuilder builder, UserSearchCriteria criteria) {
if (criteria.getDepartmentIds() != null && !criteria.getDepartmentIds().isEmpty()) {
builder.and(qUser.department.id.in(criteria.getDepartmentIds()));
}
if (criteria.getDepartmentName() != null && !criteria.getDepartmentName().trim().isEmpty()) {
builder.and(qUser.department.name.containsIgnoreCase(criteria.getDepartmentName().trim()));
}
if (criteria.getMinDepartmentBudget() != null) {
builder.and(qUser.department.budget.goe(criteria.getMinDepartmentBudget()));
}
if (criteria.getMaxDepartmentBudget() != null) {
builder.and(qUser.department.budget.loe(criteria.getMaxDepartmentBudget()));
}
}
/**
* 字串匹配類型枚舉
*/
public enum StringMatchType {
EXACT, CONTAINS, STARTS_WITH, ENDS_WITH
}
}
/**
* 用戶搜尋條件 DTO
*/
public class UserSearchCriteria {
private String username;
private String email;
private String firstName;
private String lastName;
private String phone;
private Integer minAge;
private Integer maxAge;
private Double minSalary;
private Double maxSalary;
private List<UserStatus> statuses;
private LocalDateTime createdAfter;
private LocalDateTime createdBefore;
private LocalDateTime updatedAfter;
private LocalDateTime updatedBefore;
private List<Long> departmentIds;
private String departmentName;
private Double minDepartmentBudget;
private Double maxDepartmentBudget;
// 建構子、getter 和 setter 方法省略...
}
|
留言討論