Browse Source

Merge remote-tracking branch 'origin/4.0.x' into 4.0.x

zhou-hao 5 years ago
parent
commit
e578575fd0

+ 38 - 19
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveCrudService.java

@@ -15,6 +15,7 @@ import reactor.core.publisher.Mono;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 public interface ReactiveCrudService<E, K> {
 
@@ -101,31 +102,49 @@ public interface ReactiveCrudService<E, K> {
     }
 
     @Transactional(readOnly = true)
-    default Mono<PagerResult<E>> queryPager(Mono<? extends QueryParam> queryParamMono) {
+    default Mono<PagerResult<E>> queryPager(QueryParam queryParamMono) {
+        return queryPager(queryParamMono, Function.identity());
+    }
+
+    @Transactional(readOnly = true)
+    default <T> Mono<PagerResult<T>> queryPager(QueryParam param, Function<E, T> mapper) {
+        return getRepository()
+                .createQuery()
+                .setParam(param)
+                .count()
+                .flatMap(total -> {
+                    if (total == 0) {
+                        return Mono.just(PagerResult.of(0, Collections.emptyList(), param));
+                    }
+                    return query(Mono.just(param.rePaging(total))).map(mapper)
+                            .collectList()
+                            .map(list -> PagerResult.of(total, list, param));
+                });
+    }
+
+    @Transactional(readOnly = true)
+    default <T> Mono<PagerResult<T>> queryPager(Mono<? extends QueryParam> queryParamMono, Function<E, T> mapper) {
         return queryParamMono
                 .cast(QueryParam.class)
-                .flatMap(param -> getRepository()
-                        .createQuery()
-                        .setParam(param)
-                        .count()
-                        .flatMap(total -> {
-                            if (total == 0) {
-                                return Mono.just(PagerResult.empty());
-                            }
-                            return queryParamMono
-                                    .map(QueryParam::clone)
-                                    .flatMap(q -> query(Mono.just(q.rePaging(total))).collectList())
-                                    .map(list -> PagerResult.of(total, list, param));
-                        }));
+                .flatMap(param -> queryPager(param, mapper));
+    }
+
+    @Transactional(readOnly = true)
+    default Mono<PagerResult<E>> queryPager(Mono<? extends QueryParam> queryParamMono) {
+        return queryPager(queryParamMono, Function.identity());
+    }
+
+    @Transactional(readOnly = true)
+    default Mono<Integer> count(QueryParam queryParam) {
+        return getRepository()
+                .createQuery()
+                .setParam(queryParam)
+                .count();
     }
 
     @Transactional(readOnly = true)
     default Mono<Integer> count(Mono<? extends QueryParam> queryParamMono) {
-        return queryParamMono
-                .flatMap(param -> getRepository()
-                        .createQuery()
-                        .setParam(param)
-                        .count());
+        return queryParamMono.flatMap(this::count);
     }