@@ -23,7 +23,7 @@ repositories {
23
23
}
24
24
25
25
dependencies {
26
- compile 'com.github.wenhao:jpa-spec:2.2.3 '
26
+ compile 'com.github.wenhao:jpa-spec:3.0.0 '
27
27
}
28
28
```
29
29
@@ -33,7 +33,7 @@ dependencies {
33
33
<dependency >
34
34
<groupId >com.github.wenhao</groupId >
35
35
<artifactId >jpa-spec</artifactId >
36
- <version >2.2.3 </version >
36
+ <version >3.0.0 </version >
37
37
</dependency >
38
38
```
39
39
@@ -56,7 +56,7 @@ public interface PersonRepository extends JpaRepository<Person, Long>, JpaSpecif
56
56
57
57
``` java
58
58
public Page<Person > findAll(SearchRequest request) {
59
- Specification<Person > specification = new Specifications<Person > ()
59
+ Specification<Person > specification = Specifications . < Person > builder ()
60
60
.eq(StringUtils . isNotBlank(request. getName()), " name" , request. getName())
61
61
.gt(Objects . nonNull(request. getAge()), " age" , 18 )
62
62
.between(" birthday" , new Range<> (new Date (), new Date ()))
@@ -75,7 +75,7 @@ find any person nickName equals to "dog" and name equals to "Jack"/"Eric" or nul
75
75
76
76
``` java
77
77
public List<Person > findAll(SearchRequest request) {
78
- Specification<Person > specification = new Specifications<Person > ()
78
+ Specification<Person > specification = Specifications . < Person > builder ()
79
79
.eq(" nickName" , " dog" )
80
80
.eq(StringUtils . isNotBlank(request. getName()), " name" , " Jack" , " Eric" , null )
81
81
.eq(" company" , null ) // or eq("company", (Object) null)
@@ -93,7 +93,7 @@ find any person name in "Jack" or "Eric" and company not in "ThoughtWorks" or "I
93
93
94
94
``` java
95
95
public List<Person > findAll(SearchRequest request) {
96
- Specification<Person > specification = new Specifications<Person > ()
96
+ Specification<Person > specification = Specifications . < Person > builder ()
97
97
.in(" name" , request. getNames(). toArray()) // or in("name", "Jack", "Eric")
98
98
.notIn(" company" , " ThoughtWorks" , " IBM" )
99
99
.build();
@@ -110,7 +110,7 @@ find any people age bigger than 18.
110
110
111
111
``` java
112
112
public List<Person > findAll(SearchRequest request) {
113
- Specification<Person > specification = new Specifications<Person > ()
113
+ Specification<Person > specification = Specifications . < Person > builder ()
114
114
.gt(Objects . nonNull(request. getAge()), " age" , 18 )
115
115
.build();
116
116
@@ -126,7 +126,7 @@ find any person age between 18 and 25, birthday between someday and someday.
126
126
127
127
``` java
128
128
public List<Person > findAll(SearchRequest request) {
129
- Specification<Person > specification = new Specifications<Person > ()
129
+ Specification<Person > specification = Specifications . < Person > builder ()
130
130
.between(Objects . nonNull(request. getAge(), " age" , new Range<> (18 , 25 ))
131
131
.between(" birthday" , new Range<> (new Date (), new Date ()))
132
132
.build();
@@ -143,7 +143,7 @@ find any person name like %ac% or %og%, company not like %ec%.
143
143
144
144
```java
145
145
public Page<Person > findAll(SearchRequest request) {
146
- Specification<Person > specification = new Specifications<Person > ()
146
+ Specification<Person > specification = Specifications . < Person > builder ()
147
147
.like(" name" , " ac" , " %og%" )
148
148
.notLike(" company" , " ec" )
149
149
.build();
@@ -152,17 +152,34 @@ public Page<Person> findAll(SearchRequest request) {
152
152
}
153
153
```
154
154
155
+ ####Or
156
+
157
+ support or specifications.
158
+
159
+ ```java
160
+ public List<Phone > findAll(SearchRequest request) {
161
+ Specification<Person > specification = Specifications . < Person > builder()
162
+ .and(OrSpecifications . < Person > builder()
163
+ .like(" name" , " %ac%" )
164
+ .gt(" age" , 19 )
165
+ .build())
166
+ .build();
167
+
168
+ return phoneRepository. findAll(specification);
169
+ }
170
+ ```
171
+
155
172
####Join
156
173
157
- each specification support association query as inner join.
174
+ each specification support association query as left join.
158
175
159
176
** Test : ** [JoinTest . java]
160
177
161
178
@ManyToOne association query, find person name equals to " Jack" and phone brand equals to " HuaWei" .
162
179
163
180
```java
164
181
public List<Phone > findAll(SearchRequest request) {
165
- Specification<Phone > specification = new Specifications<Phone > ()
182
+ Specification<Phone > specification = Specifications . < Phone > builder ()
166
183
.eq(StringUtils . isNotBlank(request. getBrand()), " brand" , " HuaWei" )
167
184
.eq(StringUtils . isNotBlank(request. getPersonName()), " person.name" , " Jack" )
168
185
.build();
@@ -175,7 +192,7 @@ public List<Phone> findAll(SearchRequest request) {
175
192
176
193
```java
177
194
public List<Phone > findAll(SearchRequest request) {
178
- Specification<Person > specification = new Specifications<Person > ()
195
+ Specification<Person > specification = Specifications . < Person > builder ()
179
196
.between(" age" , new Range<> (10 , 35 ))
180
197
.eq(StringUtils . isNotBlank(jack. getName()), " addresses.street" , " Chengdu" )
181
198
.build();
@@ -194,7 +211,7 @@ You can custom specification to do the @ManyToOne and @ManyToMany as well.
194
211
195
212
```java
196
213
public List<Phone > findAll(SearchRequest request) {
197
- Specification<Phone > specification = new Specifications<Phone > ()
214
+ Specification<Phone > specification = Specifications . < Phone > builder ()
198
215
.eq(StringUtils . isNotBlank(request. getBrand()), " brand" , " HuaWei" )
199
216
.and(StringUtils . isNotBlank(request. getPersonName()), (root, query, cb) - > {
200
217
Path<Person > person = root. get(" person" );
@@ -212,7 +229,7 @@ public List<Phone> findAll(SearchRequest request) {
212
229
213
230
```java
214
231
public List<Phone > findAll(SearchRequest request) {
215
- Specification<Person > specification = new Specifications<Person > ()
232
+ Specification<Person > specification = Specifications . < Person > builder ()
216
233
.between(" age" , new Range<> (10 , 35 ))
217
234
.and(StringUtils . isNotBlank(jack. getName()), ((root, query, cb) - > {
218
235
Join address = root. join(" addresses" , JoinType . LEFT );
@@ -230,14 +247,14 @@ find person by pagination and sort by name desc and birthday asc.
230
247
231
248
```java
232
249
public Page<Person > findAll(SearchRequest request) {
233
- Specification<Person > specification = new Specifications<Person > ()
250
+ Specification<Person > specification = Specifications . < Person > builder ()
234
251
.eq(StringUtils . isNotBlank(request. getName()), " name" , request. getName())
235
252
.gt(" age" , 18 )
236
253
.between(" birthday" , new Range<> (new Date (), new Date ()))
237
254
.like(" nickName" , " %og%" )
238
255
.build();
239
256
240
- Sort sort = new Sorts ()
257
+ Sort sort = Sorts . builder ()
241
258
.desc(StringUtils . isNotBlank(request. getName()), " name" )
242
259
.asc(" birthday" )
243
260
.build();
@@ -274,7 +291,7 @@ public class PersonIdCard {
274
291
275
292
```java
276
293
public List<PersonIdCard> findAll(SearchRequest request) {
277
- Specification<PersonIdCard> specification = new Specifications<PersonIdCard>()
294
+ Specification<PersonIdCard> specification = Specifications. <PersonIdCard>builder ()
278
295
.gt(Objects.nonNull(request.getAge()), "age", 18)
279
296
.build();
280
297
0 commit comments