Grails 导出模型属性的DetachedCriteria默认查询
我是grails/gorm的新手,我正在为我的前端调用构建API。我使用DetachedCriteria进行查询和筛选,我发现我复制了太多的代码 对于模型的每个类,我必须编写DetachedCriteria来创建每个属性的“eq”和“likes”(如果我想实现neq、gt、lt等,我也必须这样做) 我的问题是,有没有任何方法可以使它可重用于任何模型类 型号Grails 导出模型属性的DetachedCriteria默认查询,grails,groovy,gorm,Grails,Groovy,Gorm,我是grails/gorm的新手,我正在为我的前端调用构建API。我使用DetachedCriteria进行查询和筛选,我发现我复制了太多的代码 对于模型的每个类,我必须编写DetachedCriteria来创建每个属性的“eq”和“likes”(如果我想实现neq、gt、lt等,我也必须这样做) 我的问题是,有没有任何方法可以使它可重用于任何模型类 型号 class Model{ String id String code String name String
class Model{
String id
String code
String name
String url
...
@Service(Model)
abstract class ModelService extends DetachedCriteriaService implements IModelService {
@Override
Class getClazz(){
Model
}
protected DetachedCriteria buildCriteria(Map params) {
super.buildCriteria(params).build {}
}
...
服务
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>
}
...
接口IModelService{
模型获取(可序列化id)
作废删除(可序列化id)
模型保存(模型)
}
@服务(模型)
抽象类ModelService实现IModelService{
private DetachedCriteria buildCriteria(映射参数){
新的DetachedCriteria(模型)。生成{
if(参数q){
或{
ilike('name',“%${params.q}%”)
ilike('code',“%${params.q}%”)
ilike('url',“%${params.q}%”)
}
}
if(参数代码){
等式(“代码”,参数代码)
}
if(参数名称){
等式('name',参数名称)
}
if(params.url){
eq('url',参数url)
}
}
}
列表搜索(映射参数){
buildCriteria(params).list(params)as list
}
...
我用一个外部抽象类解决了这个问题: 型号
class Model{
String id
String code
String name
String url
...
@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()
导入grails.gorm.DetachedCriteria
抽象类DetachedCriteriaService{
受保护的DetachedCriteria buildCriteria(映射参数){
新的DetachedCriteria(getClazz()).build{
if(参数q){
或{
getQSearchFields()。每个{
ilike(它,“%${params.q}%”)
}
}
}
getFields().intersect(params.keySet())。每个{
List parts=it.split(“:”)*.trim()
字符串元素=部分[0]
字符串筛选器=部分[1]?:“eq”
开关(筛选器){//TODO实现器inList
案例“eq”:
eq元素,参数[元素]
打破
案例“ne”:
ne元素,参数[元素]
打破
案例“gt”:
gt元素,参数[元素]
打破
案例“lt”:
lt元素,参数[元素]
打破
案例“ge”:
ge元素,参数[元素]
打破
案例“le”:
le元素,参数[元素]
打破
案例“like”:
like元素,params[元素]
打破
案例“ilike”:
ilike元素,params[元素]
打破
违约:
eq元素,参数[元素]
}
}
}
}
抽象类getClazz()
我用一个外部抽象类解决了这个问题:
型号
class Model{
String id
String code
String name
String url
...
@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()
导入grails.gorm.DetachedCriteria
抽象类DetachedCriteriaService{
受保护的DetachedCriteria buildCriteria(映射参数){
新的DetachedCriteria(getClazz()).build{
if(参数q){
或{
getQSearchFields()。每个{
ilike(它,“%${params.q}%”)
}
}
}
getFields().intersect(params.keySet())。每个{
List parts=it.split(“:”)*.trim()
字符串元素=部分[0]
字符串筛选器=部分[1]?:“eq”
开关(筛选器){//TODO实现器inList
案例“eq”:
eq元素,参数[元素]
打破
案例“ne”:
ne元素,参数[元素]
打破
案例“gt”:
gt元素,参数[元素]
打破
案例“lt”:
lt元素,参数[元素]
打破
案例“ge”:
ge元素,参数[元素]
打破
案例“le”:
le元素,参数[元素]
打破
案例“like”:
like元素,params[元素]
打破
案例“ilike”:
ilike元素,params[元素]
打破
违约:
eq元素,参数[元素]
}
}
}
}
抽象类getClazz()