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

时间:2011-12-02 17:28:10

标签: grails groovy gorm

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

Store => Store.createCriteria()
客户=) Client.createCriteria()
等等。

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

class QueryUtils<T> {

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

}

这样,我的每个服务(StoreService,ClientService等)都可以扩展QueryUtils:

class StoreService extends QueryUtils<Store>
class ClientService extends QueryUtils<ClientService>

依此类推,并继承与其域类类型对应的list()方法。

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

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

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

1 个答案:

答案 0 :(得分:6)

我曾经为Hibernate做过这样的事情(Grails之外) - https://burtbeckwith.com/blog/?p=21

但它不能与Groovy一起使用,因为编译器忽略了泛型。但您可以将其更改为在构造函数中取代类而不是泛型类型:

class QueryUtils {

   private final Class clazz

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

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