我是grails/gorm的新手,我正在为我的前端调用构建API和API。我正在使用DetachedCriteria进行查询和筛选,我发现我复制的代码太多了.
对于模型的每个类,我必须编写DetachedCriteria来创建每个属性的“eq”和“like”(如果我想实现neq、gt、lt等)。
我的问题是,有什么方法可以对任何模型类进行可重用吗?
模型
class Model{
String id
String code
String name
String url
...服务
interface IModelService {
Model get(Serializable id)
void delete(Serializable id)
Model save(Model model)
}
@Service(Model)
abstract class ModelService implements IModelService{
private DetachedCriteria buildCriteria(Map params) {
new DetachedCriteria(Model).build {
if(params.q) {
or{
ilike('name', "%${params.q}%")
ilike('code', "%${params.q}%")
ilike('url', "%${params.q}%")
}
}
if(params.code) {
eq('code', params.code)
}
if(params.name) {
eq('name', params.name)
}
if(params.url) {
eq('url', params.url)
}
}
}
List<Model> search(Map params) {
buildCriteria(params).list(params) as List<Model>
}
...发布于 2020-07-22 12:22:09
我用一个外部抽象类解决了它的创建问题:
模型
@Service(Model)
abstract class ModelService extends DetachedCriteriaService implements IModelService {
@Override
Class getClazz(){
Model
}
protected DetachedCriteria buildCriteria(Map params) {
super.buildCriteria(params).build {}
}
...外部类
import grails.gorm.DetachedCriteria
abstract class DetachedCriteriaService<T> {
protected DetachedCriteria buildCriteria(Map params) {
new DetachedCriteria(getClazz()).build {
if(params.q) {
or {
getQSearchFields().each {
ilike(it, "%${params.q}%")
}
}
}
getFields().intersect(params.keySet()).each {
List<String> parts = it.split(':')*.trim()
String element = parts[0]
String filter = parts[1] ?: "eq"
switch (filter) { //TODO Implementar inList
case "eq":
eq element, params[element]
break
case "ne":
ne element, params[element]
break
case "gt":
gt element, params[element]
break
case "lt":
lt element, params[element]
break
case "ge":
ge element, params[element]
break
case "le":
le element, params[element]
break
case "like":
like element, params[element]
break
case "ilike":
ilike element, params[element]
break
default:
eq element, params[element]
}
}
}
}
abstract Class getClazz()https://stackoverflow.com/questions/62994284
复制相似问题