diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt index 0807da1..2a82aeb 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt @@ -1,10 +1,11 @@ package com.synebula.gaea.mongo +import com.synebula.gaea.query.Operator import com.synebula.gaea.query.OrderType +import com.synebula.gaea.query.Where import org.springframework.data.domain.Sort import org.springframework.data.mongodb.core.query.Criteria import org.springframework.data.mongodb.core.query.Query -import org.springframework.data.mongodb.core.query.isEqualTo import java.lang.reflect.Field @@ -25,16 +26,40 @@ fun Query.select(fields: Array): Query { * * @param params 参数列表 */ -fun Query.where(params: Map?): Query { +fun Query.where(params: Map?, onWhere: ((v: String) -> Operator) = { Operator.eq }): Query { val criteria = Criteria() if (params != null) { for (param in params) { - criteria.and(param.key).isEqualTo(param.value) + val where = onWhere(param.key) + when (where) { + Operator.eq -> criteria.and(param.key).`is`(param.value) + Operator.ne -> criteria.and(param.key).ne(param.value) + Operator.lt -> criteria.and(param.key).lt(param.value) + Operator.gt -> criteria.and(param.key).gt(param.value) + Operator.lte -> criteria.and(param.key).lte(param.value) + Operator.gte -> criteria.and(param.key).gte(param.value) + Operator.like -> criteria.and(param.key).regex(param.value.toString()) + } + } } return this.addCriteria(criteria) } +/** + * 根据参数获取查询条件 + * + * @param params 参数列表 + */ +fun Query.where(params: Map?, clazz: Class<*>): Query { + var field: Field? + var where: Where? + return this.where(params) { name -> + field = clazz.getDeclaredField(name) + where = field?.getDeclaredAnnotation(Where::class.java) + if (where == null) Operator.eq else where!!.operator + } +} /** * 获取ID查询条件 diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt index 1ae8521..5826adc 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt @@ -83,7 +83,7 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo val fields = this.clazz!!.fields() val query = Query() query.select(fields.toTypedArray()) - query.where(params) + query.where(params, this.clazz!!) this.template.find(query, this.clazz!!, this.collection) } else listOf() } @@ -92,7 +92,7 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo this.check() return if (this.clazz != null) { val query = Query() - this.template.count(query.where(params), this.collection).toInt() + this.template.count(query.where(params, this.clazz!!), this.collection).toInt() } else 0 } @@ -102,7 +102,7 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo val query = Query() val fields = this.clazz!!.fields() val result = PagingData(params.page, params.size) - query.where(params.parameters) + query.where(params.parameters, this.clazz!!) result.total = this.count(params.parameters) query.select(fields.toTypedArray()) query.with(order(params.orderBy)) diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt index 709738b..f1dec2f 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt @@ -37,14 +37,14 @@ open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQ override fun list(params: Map?, clazz: Class): List { val fields = clazz.fields() val query = Query() - query.where(params) + query.where(params, clazz) query.select(fields.toTypedArray()) return this.repo.find(query, clazz, this.collection(clazz)) } override fun count(params: Map?, clazz: Class): Int { val query = Query() - return this.repo.count(query.where(params), this.collection(clazz)).toInt() + return this.repo.count(query.where(params, clazz), this.collection(clazz)).toInt() } override fun paging(params: PagingParam, clazz: Class): PagingData { @@ -53,7 +53,7 @@ open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQ result.size = params.size result.page = params.page val query = Query() - query.where(params.parameters) + query.where(params.parameters, clazz) result.total = this.count(params.parameters, clazz) query.select(fields.toTypedArray()) query.with(order(params.orderBy)) diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/Operator.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Operator.kt new file mode 100644 index 0000000..f7a21d4 --- /dev/null +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Operator.kt @@ -0,0 +1,38 @@ +package com.synebula.gaea.query + +enum class Operator { + /** + * 等于 + */ + eq, + + /** + * 不等于 + */ + ne, + + /** + * 小于 + */ + lt, + + /** + * 大于 + */ + gt, + + /** + * 小于或等于 + */ + lte, + + /** + * 大于或等于 + */ + gte, + + /** + * 模糊匹配 + */ + like +} \ No newline at end of file diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/Where.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Where.kt new file mode 100644 index 0000000..d7834e4 --- /dev/null +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Where.kt @@ -0,0 +1,4 @@ +package com.synebula.gaea.query + +@Target(AnnotationTarget.FIELD) +annotation class Where(val operator: Operator) \ No newline at end of file