Grails 如何以通用方式在域类上调用GORM方法?

Grails 如何以通用方式在域类上调用GORM方法?,grails,groovy,gorm,Grails,Groovy,Gorm,我编写了一个list()方法,用于检索与一组筛选器匹配的域类实例列表,该方法用于不同的域类;除了调用GORM方法的类之外,代码完全相同: Store=>Store.createCriteria() Client=>Client.createCriteria() 等等 为了避免代码重复,我尝试创建一个泛型类来创建list方法的泛型版本: class QueryUtils<T> { def list(params) { T.createCriteria()

我编写了一个list()方法,用于检索与一组筛选器匹配的域类实例列表,该方法用于不同的域类;除了调用GORM方法的类之外,代码完全相同:

Store=>Store.createCriteria()
Client=>Client.createCriteria()
等等

为了避免代码重复,我尝试创建一个泛型类来创建list方法的泛型版本:

class QueryUtils<T> {

    def list(params) {
        T.createCriteria()
        [...]
    }

}
类查询tils{
def列表(参数){
T.createCriteria()
[...]
}
}
这样,我的每项服务(StoreService、ClientService等)都可以扩展查询直到:

class StoreService extends QueryUtils<Store>
class ClientService extends QueryUtils<ClientService>
class StoreService扩展查询直到
类ClientService扩展了QueryUtils
依此类推,并继承与其域类类型对应的list()方法

问题是在执行期间,它不起作用,因为t的有效类型是java.lang.Object,而不是我指定的域类类型:

groovy.lang.MissingMethodException:没有方法的签名:static java.lang.Object.createCriteria()适用于参数类型:()值:[]


你知道如何解决这个问题吗?

不久前我在Hibernate(Grails之外)做过类似的事情-

但是它不适用于Groovy,因为编译器忽略了泛型。但您可以将其更改为在构造函数中接受类,而不是作为泛型类型:

class QueryUtils {

   private final Class clazz

   QueryUtils(Class clazz) {
      this.clazz = clazz
   }

   def list(params) {
      clazz.createCriteria()
      [...]
   }
}

不久前我在Hibernate(Grails之外)做过类似的事情-

但是它不适用于Groovy,因为编译器忽略了泛型。但您可以将其更改为在构造函数中接受类,而不是作为泛型类型:

class QueryUtils {

   private final Class clazz

   QueryUtils(Class clazz) {
      this.clazz = clazz
   }

   def list(params) {
      clazz.createCriteria()
      [...]
   }
}

事实上,groovy接受语法而不考虑它的事实是相当误导的。感谢您提供了这个解决方案,它工作得很好。事实上,groovy接受语法而不考虑它的事实是相当误导的。感谢您提供此解决方案,它工作正常。