Grails 如何以通用方式在域类上调用GORM方法?
我编写了一个list()方法,用于检索与一组筛选器匹配的域类实例列表,该方法用于不同的域类;除了调用GORM方法的类之外,代码完全相同: Store=>Store.createCriteria()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()
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接受语法而不考虑它的事实是相当误导的。感谢您提供此解决方案,它工作正常。