【问题标题】:How to call GORM methods on domain classes in a generic way?如何以通用方式在域类上调用 GORM 方法?
【发布时间】:2011-12-02 17:28:09
【问题描述】:

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

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

为了避免代码重复,我尝试通过创建一个泛型类来制作列表方法的泛型版本:

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:没有方法签名:静态 java.lang.Object.createCriteria() 适用于参数类型:() 值:[]

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

【问题讨论】:

    标签: grails groovy grails-orm


    【解决方案1】:

    不久前我为 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()
          [...]
       }
    }
    

    【讨论】:

    • 确实,groovy 接受语法而不考虑它的事实是相当误导的。感谢您提供此解决方案,效果很好。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2012-06-10
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多