diff --git a/orm/src/main/java/com/zfoo/orm/OrmContext.java b/orm/src/main/java/com/zfoo/orm/OrmContext.java index c1725b67..cb1ca093 100644 --- a/orm/src/main/java/com/zfoo/orm/OrmContext.java +++ b/orm/src/main/java/com/zfoo/orm/OrmContext.java @@ -17,7 +17,9 @@ import com.mongodb.client.MongoClient; import com.zfoo.orm.manager.IOrmManager; import com.zfoo.orm.manager.OrmManager; import com.zfoo.orm.model.accessor.IAccessor; +import com.zfoo.orm.model.entity.IEntity; import com.zfoo.orm.model.query.IQuery; +import com.zfoo.orm.model.query.IQueryBuilder; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.scheduler.SchedulerContext; import com.zfoo.scheduler.model.StopWatch; @@ -62,8 +64,8 @@ public class OrmContext implements ApplicationListener, return instance.accessor; } - public static IQuery getQuery() { - return instance.query; + public static > IQueryBuilder getQuery(Class entityClazz) { + return instance.query.builder(entityClazz); } public static IOrmManager getOrmManager() { diff --git a/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java b/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java index 40657d29..42dedb23 100644 --- a/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java +++ b/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java @@ -241,7 +241,7 @@ public class EntityCaches, E extends IEntity> impl var ids = updateList.stream().map(it -> it.id()).collect(Collectors.toList()); try { - var dbList = OrmContext.getQuery().queryFieldIn("_id", ids, (Class) entityDef.getClazz()); + List dbList = OrmContext.getQuery(entityDef.getClazz()).in("_id", ids).queryAll(); var dbMap = dbList.stream().collect(Collectors.toMap(key -> key.id(), value -> value)); for (var entity : updateList) { var dbEntity = dbMap.get(entity.id()); diff --git a/orm/src/main/java/com/zfoo/orm/model/query/IQuery.java b/orm/src/main/java/com/zfoo/orm/model/query/IQuery.java index 55880980..00799b61 100644 --- a/orm/src/main/java/com/zfoo/orm/model/query/IQuery.java +++ b/orm/src/main/java/com/zfoo/orm/model/query/IQuery.java @@ -14,9 +14,6 @@ package com.zfoo.orm.model.query; import com.zfoo.orm.model.entity.IEntity; -import com.zfoo.protocol.model.Pair; - -import java.util.List; /** * 对数据库进行(查找)的相关方法 @@ -25,22 +22,5 @@ import java.util.List; * @version 3.0 */ public interface IQuery { - - > List queryFieldLike(String fieldName, String fieldValue, Class entityClazz); - - > List queryAll(Class entityClazz); - - > List queryFieldEqual(String fieldName, Object fieldValue, Class entityClazz); - - > List queryFieldIn(String fieldName, List fieldValueList, Class entityClazz); - - /** - * 分页查询,默认按照id排序 - * - * @param page 第几页 - * @param itemsPerPage 每页容量 - * @param entityClazz 实体类 - */ - > Pair> pageQuery(int page, int itemsPerPage, Class entityClazz); - + > IQueryBuilder builder(Class entityClazz); } diff --git a/orm/src/main/java/com/zfoo/orm/model/query/IQueryBuilder.java b/orm/src/main/java/com/zfoo/orm/model/query/IQueryBuilder.java new file mode 100644 index 00000000..2b5ef141 --- /dev/null +++ b/orm/src/main/java/com/zfoo/orm/model/query/IQueryBuilder.java @@ -0,0 +1,39 @@ +package com.zfoo.orm.model.query; + +import com.zfoo.orm.model.entity.IEntity; +import com.zfoo.protocol.model.Pair; + +import java.util.List; + +/* +EQ、= 等于(=) +NE、<> 不等于(<>) +GT、> 大于(>) +GTE、>= 大于等于(>=) +LT、< 小于(<) +lte、<= 小于等于(<=) +LIKE 模糊查询 +[n] in (不在)IN 查询 + */ +public interface IQueryBuilder{ + IQueryBuilder eq(String fieldName, Object fieldValue); + IQueryBuilder ne(String fieldName, Object fieldValue); + IQueryBuilder in(String fieldName, List fieldValueList); + IQueryBuilder nin(String fieldName, List fieldValueList); + IQueryBuilder like(String fieldName, String fieldValue); + IQueryBuilder lt(String fieldName, Object fieldValue); + IQueryBuilder lte(String fieldName, Object fieldValue); + IQueryBuilder gt(String fieldName, Object fieldValue); + IQueryBuilder gte(String fieldName, Object fieldValue); + List queryAll(); + E find(); + + + /** + * 分页查询,默认按照id排序 + * + * @param page 第几页 + * @param itemsPerPage 每页容量 + */ + Pair> page(int page, int itemsPerPage); +} diff --git a/orm/src/main/java/com/zfoo/orm/model/query/MongoQueryBuilder.java b/orm/src/main/java/com/zfoo/orm/model/query/MongoQueryBuilder.java new file mode 100644 index 00000000..a854fdc1 --- /dev/null +++ b/orm/src/main/java/com/zfoo/orm/model/query/MongoQueryBuilder.java @@ -0,0 +1,136 @@ +package com.zfoo.orm.model.query; + +import com.mongodb.client.model.Filters; +import com.zfoo.orm.OrmContext; +import com.zfoo.orm.model.entity.IEntity; +import com.zfoo.protocol.collection.CollectionUtils; +import com.zfoo.protocol.model.Pair; +import com.zfoo.protocol.util.StringUtils; +import org.bson.conversions.Bson; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class MongoQueryBuilder> implements IQueryBuilder{ + private Class entity; + private Bson builer; + MongoQueryBuilder(Class entityClazz) + { + entity = entityClazz; + } + + + @Override + public IQueryBuilder eq(String fieldName, Object fieldValue) { + var bson = Filters.eq(fieldName, fieldValue); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + @Override + public IQueryBuilder ne(String fieldName, Object fieldValue) { + var bson = Filters.ne(fieldName, fieldValue); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + @Override + public IQueryBuilder lt(String fieldName, Object fieldValue) { + var bson = Filters.lt(fieldName, fieldValue); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + @Override + public IQueryBuilder lte(String fieldName, Object fieldValue) { + var bson = Filters.lte(fieldName, fieldValue); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + @Override + public IQueryBuilder gt(String fieldName, Object fieldValue) { + var bson = Filters.gt(fieldName, fieldValue); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + @Override + public IQueryBuilder gte(String fieldName, Object fieldValue) { + var bson = Filters.gte(fieldName, fieldValue); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + + @Override + public IQueryBuilder in(String fieldName, List fieldValueList) { + var bson = Filters.in(fieldName, fieldValueList); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + + @Override + public IQueryBuilder nin(String fieldName, List fieldValueList) { + var bson = Filters.nin(fieldName, fieldValueList); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + + @Override + public IQueryBuilder like(String fieldName, String fieldValue) { + var regex = StringUtils.format("^{}.*", fieldValue); + var bson = Filters.regex(fieldName, regex); + if(builer!=null) builer = Filters.and(builer, bson); + else builer = bson; + return this; + } + + @Override + public List queryAll() { + var collection = OrmContext.getOrmManager().getCollection(entity); + var list = new ArrayList(); + var result = builer!=null?collection.find(builer):collection.find(); + result.forEach(new Consumer>() { + @Override + public void accept(IEntity entity) { + list.add((E)entity); + } + }); + return list; + } + + @Override + public E find() { + var collection = OrmContext.getOrmManager().getCollection(entity); + var list = builer!=null?collection.find(builer):collection.find(); + for (E row : list) { + return row; + } + return null; + } + + @Override + public Pair> page(int page, int itemsPerPage) { + var collection = OrmContext.getOrmManager().getCollection(entity); + + var p = Page.valueOf(page, itemsPerPage, collection.countDocuments()); + + var result = builer!=null?collection.find(builer):collection.find(); + var list = new ArrayList(); + result + .skip(p.skipNum()) + .limit(p.getItemsPerPage()) + .forEach(new Consumer>() { + @Override + public void accept(IEntity entity) { + list.add((E) entity); + } + }); + + return new Pair<>(p, list); + } +} diff --git a/orm/src/main/java/com/zfoo/orm/model/query/MongodbQuery.java b/orm/src/main/java/com/zfoo/orm/model/query/MongodbQuery.java index b691fa22..c1946957 100644 --- a/orm/src/main/java/com/zfoo/orm/model/query/MongodbQuery.java +++ b/orm/src/main/java/com/zfoo/orm/model/query/MongodbQuery.java @@ -13,17 +13,7 @@ package com.zfoo.orm.model.query; -import com.mongodb.client.model.Filters; -import com.zfoo.orm.OrmContext; import com.zfoo.orm.model.entity.IEntity; -import com.zfoo.protocol.collection.CollectionUtils; -import com.zfoo.protocol.model.Pair; -import com.zfoo.protocol.util.StringUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; /** * @author jaysunxiao @@ -32,82 +22,7 @@ import java.util.function.Consumer; public class MongodbQuery implements IQuery { @Override - public > List queryAll(Class entityClazz) { - var collection = OrmContext.getOrmManager().getCollection(entityClazz); - var list = new ArrayList(); - collection.find().forEach(new Consumer>() { - @Override - public void accept(IEntity entity) { - list.add((E) entity); - } - }); - return list; + public > IQueryBuilder builder(Class entityClazz) { + return new MongoQueryBuilder(entityClazz); } - - @Override - public > List queryFieldEqual(String fieldName, Object fieldValue, Class entityClazz) { - if (fieldValue == null) { - return Collections.emptyList(); - } - var collection = OrmContext.getOrmManager().getCollection(entityClazz); - var list = new ArrayList(); - collection.find(Filters.eq(fieldName, fieldValue)).forEach(new Consumer>() { - @Override - public void accept(IEntity entity) { - list.add((E) entity); - } - }); - return list; - } - - @Override - public > List queryFieldLike(String fieldName, String fieldValue, Class entityClazz) { - if (StringUtils.isBlank(fieldValue)) { - return Collections.emptyList(); - } - var collection = OrmContext.getOrmManager().getCollection((Class>) entityClazz); - var list = new ArrayList(); - var regex = StringUtils.format("^{}.*", fieldValue); - collection.find(Filters.regex(fieldName, regex)).forEach((Consumer>) entity -> list.add((E) entity)); - return list; - } - - @Override - public > List queryFieldIn(String fieldName, List fieldValueList, Class entityClazz) { - if (CollectionUtils.isEmpty(fieldValueList)) { - return Collections.emptyList(); - } - - var collection = OrmContext.getOrmManager().getCollection(entityClazz); - var list = new ArrayList(); - collection.find(Filters.in(fieldName, fieldValueList)).forEach(new Consumer>() { - @Override - public void accept(IEntity entity) { - list.add((E) entity); - } - }); - return list; - } - - @Override - public > Pair> pageQuery(int page, int itemsPerPage, Class entityClazz) { - var collection = OrmContext.getOrmManager().getCollection(entityClazz); - - var p = Page.valueOf(page, itemsPerPage, collection.countDocuments()); - - var list = new ArrayList(); - collection.find() - .skip(p.skipNum()) - .limit(p.getItemsPerPage()) - .forEach(new Consumer>() { - @Override - public void accept(IEntity entity) { - list.add((E) entity); - } - }); - - return new Pair<>(p, list); - } - - } diff --git a/orm/src/test/java/com/zfoo/orm/query/QueryTest.java b/orm/src/test/java/com/zfoo/orm/query/QueryTest.java index 5c4611ca..73edaa6e 100644 --- a/orm/src/test/java/com/zfoo/orm/query/QueryTest.java +++ b/orm/src/test/java/com/zfoo/orm/query/QueryTest.java @@ -15,6 +15,7 @@ package com.zfoo.orm.query; import com.zfoo.orm.OrmContext; import com.zfoo.orm.entity.UserEntity; +import com.zfoo.orm.util.MongoIdUtils; import org.junit.Ignore; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -30,14 +31,21 @@ public class QueryTest { @Test public void queryAllTest() { var context = new ClassPathXmlApplicationContext("application.xml"); - var list = OrmContext.getQuery().queryAll(UserEntity.class); + + var id = MongoIdUtils.getIncrementIdFromMongoDefault(UserEntity.class); + var entity = new UserEntity(); + entity.setId(id); + entity.setC((int)id); + entity.setE("User_"+id); + OrmContext.getAccessor().insert(entity); + var list = OrmContext.getQuery(UserEntity.class).eq("e", "User_1").eq("f", null).queryAll(); System.out.println(list); } @Test public void queryByFieldTest() { var context = new ClassPathXmlApplicationContext("application.xml"); - var list = OrmContext.getQuery().queryFieldEqual("a", 1, UserEntity.class); + var list = OrmContext.getQuery(UserEntity.class).eq("a", 1).queryAll(); System.out.println(list); }