日期查询待解决

This commit is contained in:
2020-05-25 18:16:13 +08:00
parent 367bd2cb55
commit 1178359bcd
2 changed files with 69 additions and 27 deletions

View File

@@ -1,5 +1,6 @@
package com.synebula.gaea.mongo package com.synebula.gaea.mongo
import com.synebula.gaea.data.date.DateTime
import com.synebula.gaea.query.Operator import com.synebula.gaea.query.Operator
import com.synebula.gaea.query.OrderType import com.synebula.gaea.query.OrderType
import com.synebula.gaea.query.Where import com.synebula.gaea.query.Where
@@ -7,6 +8,7 @@ import org.springframework.data.domain.Sort
import org.springframework.data.mongodb.core.query.Criteria import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query import org.springframework.data.mongodb.core.query.Query
import java.lang.reflect.Field import java.lang.reflect.Field
import java.util.*
/** /**
@@ -27,36 +29,55 @@ fun Query.select(fields: Array<String>): Query {
* @param params 参数列表 * @param params 参数列表
* @param onWhere 获取字段查询方式的方法 * @param onWhere 获取字段查询方式的方法
*/ */
fun Query.where(params: Map<String, Any>?, onWhere: ((v: String) -> Operator) = { Operator.default }): Query { fun Query.where(
val criteria = Criteria() params: Map<String, Any>?,
val rangeStartSuffix = ".start" //范围查询开始后缀 onWhere: ((v: String) -> Operator) = { Operator.default },
val rangeEndSuffix = ".end" //范围查询结束后缀 onFieldType: ((v: String) -> Class<*>?) = { null }
): Query {
val list = arrayListOf<Criteria>()
if (params != null) { if (params != null) {
for (param in params) { for (param in params) {
val key = param.key val key = param.key
var value = param.value
val fieldType = onFieldType(key)
if (fieldType != null && value.javaClass != fieldType && fieldType == Date::class.java) {
value = DateTime(value.toString(), "yyyy-MM-dd").date
}
when (onWhere(key)) { when (onWhere(key)) {
Operator.eq -> criteria.and(key).`is`(param.value) Operator.eq -> list.add(Criteria.where(key).`is`(value))
Operator.ne -> criteria.and(key).ne(param.value) Operator.ne -> list.add(Criteria.where(key).ne(value))
Operator.lt -> criteria.and(key).lt(param.value) Operator.lt -> list.add(Criteria.where(key).lt(value))
Operator.gt -> criteria.and(key).gt(param.value) Operator.gt -> list.add(Criteria.where(key).gt(value))
Operator.lte -> criteria.and(key).lte(param.value) Operator.lte -> list.add(Criteria.where(key).lte(value))
Operator.gte -> criteria.and(key).gte(param.value) Operator.gte -> list.add(Criteria.where(key).gte(value))
Operator.like -> criteria.and(key).regex(param.value.toString()) Operator.like -> list.add(Criteria.where(key).regex(value.toString()))
Operator.default -> { Operator.default -> rangeWhere(param.key, value, onFieldType(param.key), list)
}
}
}
return this.addCriteria(Criteria().andOperator(*list.toTypedArray()))
}
private fun rangeWhere(key: String, value: Any, fieldType: Class<*>?, list: MutableList<Criteria>) {
val rangeStartSuffix = "[0]" //范围查询开始后缀
val rangeEndSuffix = "[1]" //范围查询结束后缀
var condition = value
if (value.javaClass != fieldType && fieldType == Date::class.java) {
condition = DateTime(value.toString(), "yyyy-MM-dd").date
}
when { when {
//以范围查询开始后缀结尾表示要用大于或等于查询方式 //以范围查询开始后缀结尾表示要用大于或等于查询方式
key.endsWith(rangeStartSuffix) -> key.endsWith(rangeStartSuffix) ->
criteria.and(key.removeSuffix(rangeStartSuffix)).gte(param.value) list.add(
Criteria.where(key.removeSuffix(rangeStartSuffix)).gte(condition)
)
//以范围查询结束后缀结尾表示要用小于或等于查询方式 //以范围查询结束后缀结尾表示要用小于或等于查询方式
key.endsWith(rangeEndSuffix) -> key.endsWith(rangeEndSuffix) ->
criteria.and(key.removeSuffix(rangeEndSuffix)).gte(param.value) list.add(
else -> criteria.and(key).`is`(param.value) Criteria.where(key.removeSuffix(rangeEndSuffix)).lte(condition)
)
else -> list.add(Criteria.where(key).`is`(value))
} }
}
}
}
}
return this.addCriteria(criteria)
} }
/** /**
@@ -67,11 +88,11 @@ fun Query.where(params: Map<String, Any>?, onWhere: ((v: String) -> Operator) =
fun Query.where(params: Map<String, Any>?, clazz: Class<*>): Query { fun Query.where(params: Map<String, Any>?, clazz: Class<*>): Query {
var field: Field? var field: Field?
var where: Where? var where: Where?
return this.where(params) { name -> return this.where(params, { name ->
field = clazz.getDeclaredField(name) field = clazz.declaredFields.find { it.name == name }
where = field?.getDeclaredAnnotation(Where::class.java) where = field?.getDeclaredAnnotation(Where::class.java)
if (where == null) Operator.eq else where!!.operator if (where == null) Operator.default else where!!.operator
} })
} }
/** /**

View File

@@ -0,0 +1,21 @@
package com.synebula.gaea.domain.model
import java.util.*
/**
* 记录聚合根
* 聚合根外添加了创建和修改的人\时间信息
*/
abstract class AggregateRecord<TKey> : AggregateRoot<TKey>() {
var creator: String? = null
var creatorName: String? = null
var created: Date = Date()
set(value) {
field = value
modified = value
}
var modifier: String? = null
var modifierName: String? = null
var modified: Date = Date()
}