Skip to content

Commit a3ff846

Browse files
committed
or 查询优化
1 parent 1f85383 commit a3ff846

File tree

9 files changed

+203
-42
lines changed

9 files changed

+203
-42
lines changed

README.md

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ LambdaQuery 将支持通过Lambda进行多种数据源的查询 实现java端的
99
* [ ] 实现 新增,删除,更新等基础操作[开发中]
1010

1111
### 2. mybatis-plus
12-
* [ ] 接入mybatis-plus的查询接口
12+
* [x] 接入mybatis-plus的查询接口(已完成)
1313
* [ ] 接入mybatis-plus 的新增,删除,更新操作
1414
* [ ] 新增LoadJoin功能,通过selectIn的方式进行数据表join
1515
* [ ] 新增Cache功能,采用redis 进行数据缓存,配合selectIn方式避免join查询直接访问数据库
@@ -45,13 +45,67 @@ LambdaQuery 将支持通过Lambda进行多种数据源的查询 实现java端的
4545

4646

4747

48-
### 3.持久化操作
48+
## 使用说明
49+
### 1.依赖引入
50+
1. springBoot自动配置
51+
```xml
52+
<dependency>
53+
<groupId>com.github.xuejike</groupId>
54+
<artifactId>lambda-query-mongo-starter</artifactId>
55+
<version>${jkquery.version}</version>
56+
</dependency>
57+
```
58+
2. 手动配置
4959

50-
* 新增
51-
* 删除
52-
* 更新
53-
* 条件更新
60+
引入依赖
61+
```xml
62+
<dependency>
63+
<groupId>com.github.xuejike</groupId>
64+
<artifactId>lambda-query-mongo</artifactId>
65+
<version>${jkquery.version}</version>
66+
</dependency>
67+
```
5468

55-
## 扩展其他查询
69+
初始化工厂类
70+
```java
71+
72+
MongoDaoFactory mongoDaoFactory = new MongoDaoFactory(mongoTemplate);
73+
74+
```
75+
### 2.Mongo查询器使用
76+
77+
1. 创建实体类
78+
79+
```java
80+
@Document("demo_doc")
81+
@Data
82+
// 采用mongo进行查询
83+
@MongoDaoSelect
84+
public class TestDoc {
85+
@MongoId
86+
private String id;
87+
private String name;
88+
private String title;
89+
private Long num;
90+
private List<Title> toc;
91+
@Data
92+
public static class Title{
93+
private String title;
94+
private String desc;
95+
96+
}
97+
}
98+
99+
```
100+
101+
2. 进行查询
102+
```java
103+
JkLambdaQuery<TestDoc> lambda = JkQuerys.lambdaQuery(TestDoc.class);
104+
105+
106+
```
107+
108+
109+
### 3.MybatisPlus查询器使用
56110

57111

lambda-query-core/src/main/java/com/github/xuejike/query/core/base/BaseNestedWhereQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* @author xuejike
77
* @date 2020/12/18
88
*/
9-
public class BaseNestedWhereQuery<T,F,C extends BaseWhereQuery> extends BaseSimpleWhereQuery<T,F,C>{
9+
public class BaseNestedWhereQuery<T,F,C extends BaseWhereQuery<T,F,C>> extends BaseSimpleWhereQuery<T,F,C>{
1010

1111
public BaseNestedWhereQuery() {
1212

lambda-query-core/src/main/java/com/github/xuejike/query/core/base/BaseSimpleWhereQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* @author xuejike
55
* @date 2020/12/18
66
*/
7-
public class BaseSimpleWhereQuery<T,F,C extends BaseWhereQuery> extends BaseWhereQuery<T,F,C>{
7+
public class BaseSimpleWhereQuery<T,F,C extends BaseWhereQuery<T,F,C>> extends BaseWhereQuery<T,F,C>{
88

99

1010
public BaseSimpleWhereQuery() {

lambda-query-core/src/main/java/com/github/xuejike/query/core/base/BaseWhereQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* @date 2020/12/16
2323
*/
2424

25-
public class BaseWhereQuery<T,F,C extends BaseWhereQuery> implements WhereCriteria<C,F>,SelectCriteria<C,F>{
25+
public class BaseWhereQuery<T,F,C extends BaseWhereQuery<T,F,C>> implements WhereCriteria<C,F>,SelectCriteria<C,F>{
2626
protected Map<Object, Map<WhereOperation,Object>> whereMap = new ConcurrentHashMap<>();
2727
protected List<BaseWhereQuery<T,F,?>> orList = new LinkedList<>();
2828
protected List<FieldInfo> selectList = new LinkedList<>();

lambda-query-core/src/main/java/com/github/xuejike/query/core/criteria/DaoCriteria.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.Serializable;
44
import java.util.List;
5+
import java.util.Optional;
56

67
/**
78
* @author xuejike
@@ -17,6 +18,12 @@ public interface DaoCriteria<T> {
1718
default List<T> list(){
1819
return getDao().list();
1920
}
21+
default T getFirst(){
22+
return getDao().getFirst();
23+
}
24+
default Optional<T> getFirstStream(){
25+
return Optional.ofNullable(getFirst());
26+
}
2027
default Long count(){
2128
return getDao().count();
2229
}
@@ -38,6 +45,9 @@ default T findById(Serializable id){
3845
return getDao().findById(id);
3946
}
4047

48+
default Optional<T> findByIdStream(Serializable id){
49+
return Optional.ofNullable(findById(id));
50+
}
4151
/**
4252
* 根据ID进行更新
4353
* @param entity

lambda-query-mongo/src/main/java/com/github/xuejike/query/mongo/MongoDao.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,18 @@ public DaoCriteria<T> getDao() {
7575
}
7676

7777

78+
@Override
79+
public T getFirst() {
80+
Query query = buildQuery();
81+
query.limit(1);
82+
List<T> list = mongoTemplate.find(query, entityCls);
83+
if (list.isEmpty()){
84+
return null;
85+
}else{
86+
return list.get(0);
87+
}
88+
89+
}
7890

7991
@Override
8092
public List<T> list() {

lambda-query-mongo/src/main/java/com/github/xuejike/query/mongo/MongoQueryBuilder.java

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package com.github.xuejike.query.mongo;
22

33
import cn.hutool.core.collection.CollUtil;
4+
import cn.hutool.core.collection.ListUtil;
45
import cn.hutool.core.util.StrUtil;
56
import com.github.xuejike.query.core.base.BaseNestedWhereQuery;
67
import com.github.xuejike.query.core.enums.WhereOperation;
78
import com.github.xuejike.query.core.po.*;
89
import org.springframework.data.mongodb.core.query.Criteria;
910
import org.springframework.data.mongodb.core.query.Query;
1011

11-
import java.util.List;
12-
import java.util.Map;
13-
import java.util.Objects;
14-
import java.util.Set;
12+
import java.util.*;
1513
import java.util.function.IntFunction;
1614
import java.util.stream.Collectors;
1715

@@ -31,37 +29,34 @@ public static Query builder(QueryInfo queryInfo) {
3129
updateCriteria(where,item.getVal());
3230
query.addCriteria(where);
3331
}
34-
List<QueryInfo> or = queryInfo.getOr();
32+
if (CollUtil.isNotEmpty(queryInfo.getOr())){
33+
Criteria criteria = new Criteria();
34+
Criteria[] criteriaArray = queryInfo.getOr().stream().map(MongoQueryBuilder::orBuildItem).toArray(Criteria[]::new);
35+
query.addCriteria(criteria.orOperator(criteriaArray));
3536

36-
37-
Criteria[] criteriaList = or.stream().map(MongoQueryBuilder::buildItem).filter(Objects::nonNull).toArray(Criteria[]::new);
38-
if (criteriaList.length > 0){
39-
Criteria orCriteria = new Criteria();
40-
orCriteria.orOperator(criteriaList);
41-
query.addCriteria(orCriteria);
4237
}
4338

4439
return query;
4540
}
46-
protected static Criteria buildItem(QueryInfo queryInfo){
41+
42+
43+
protected static Criteria orBuildItem(QueryInfo queryInfo){
4744
if (queryInfo.getAnd().isEmpty() && queryInfo.getOr().isEmpty()){
4845
return null;
4946
}
47+
ArrayList<Criteria> list = new ArrayList<>(queryInfo.getAnd().size() + queryInfo.getOr().size());
5048
Criteria criteria = new Criteria();
49+
5150
List<QueryItem> and = queryInfo.getAnd();
5251
for (QueryItem item : and) {
5352
Criteria where = Criteria.where(buildField(item.getField()));
5453
updateCriteria(where,item.getVal());
55-
criteria.andOperator(where);
54+
list.add(where);
5655
}
5756

58-
List<QueryInfo> or = queryInfo.getOr();
59-
for (QueryInfo info : or) {
60-
Criteria buildItem = buildItem(info);
61-
if (buildItem != null){
62-
criteria.orOperator(buildItem);
63-
}
64-
}
57+
List<Criteria> orList = queryInfo.getOr().stream().map(MongoQueryBuilder::orBuildItem).collect(Collectors.toList());
58+
list.addAll(orList);
59+
criteria.orOperator(list.toArray(new Criteria[0]));
6560
return criteria;
6661
}
6762
public static String buildField(FieldInfo fieldInfo){
@@ -74,30 +69,41 @@ public static String buildField(FieldInfo fieldInfo){
7469
}
7570
protected static void updateCriteria(Criteria criteria, Map<WhereOperation,Object> valMap){
7671
for (Map.Entry<WhereOperation, Object> entry : valMap.entrySet()) {
72+
Object value = entry.getValue();
7773
switch (entry.getKey()){
7874
case eq:
79-
criteria.is(entry.getValue());
75+
criteria.is(value);
8076
break;
8177
case gt:
82-
criteria.gt(entry.getValue());
78+
criteria.gt(value);
8379
break;
8480
case gte:
85-
criteria.gte(entry.getValue());
81+
criteria.gte(value);
8682
break;
8783
case lt:
88-
criteria.lt(entry.getValue());
84+
criteria.lt(value);
8985
break;
9086
case lte:
91-
criteria.lte(entry.getValue());
87+
criteria.lte(value);
9288
break;
9389
case in:
94-
criteria.in(entry.getValue());
90+
if (value instanceof Collection){
91+
criteria.in((Collection)value);
92+
}else{
93+
criteria.in(value);
94+
}
95+
9596
break;
9697
case notIn:
97-
criteria.nin(entry.getValue());
98+
if (value instanceof Collection){
99+
criteria.nin((Collection)value);
100+
}else{
101+
criteria.nin(value);
102+
}
103+
98104
break;
99105
case ne:
100-
criteria.ne(entry.getValue());
106+
criteria.ne(value);
101107
break;
102108
case isNull:
103109
criteria.is(null);
@@ -106,10 +112,10 @@ protected static void updateCriteria(Criteria criteria, Map<WhereOperation,Objec
106112
criteria.exists(true);
107113
break;
108114
case like:
109-
criteria.regex(regexVal(entry.getValue()));
115+
criteria.regex(regexVal(value));
110116
break;
111117
case between:
112-
BetweenObj obj = (BetweenObj) entry.getValue();
118+
BetweenObj obj = (BetweenObj) value;
113119
criteria.gt(obj.getFirst());
114120
criteria.lt(obj.getSecond());
115121
break;

lambda-query-mybatis-plus/src/main/java/com/github/xuejike/query/mybatisplus/MyBatisPlusDao.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,18 @@ protected QueryWrapper<T> buildQuery(){
5252
}
5353
return build;
5454
}
55+
5556
@Override
5657
public DaoCriteria<T> getDao() {
5758
return this;
5859
}
5960

61+
@Override
62+
public T getFirst() {
63+
QueryWrapper<T> query = buildQuery();
64+
return baseMapper.selectOne(query);
65+
}
66+
6067
@Override
6168
public List<T> list() {
6269
QueryWrapper<T> query = buildQuery();

0 commit comments

Comments
 (0)