2011-12-02 17 views
1

我寫了一個list()方法來檢索與一組過濾器匹配的域類實例列表,並且此方法用於不同的域類;代碼是一致,除了在其上GORM方法稱爲類是相同的:如何以通用的方式在域類上調用GORM方法?

商店=> 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:否方法的簽名:static java.lang.Object.createCriteria()適用於參數類型:()values:[]

你知道如何解決這個問題嗎?

回答

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() 
     [...] 
    } 
} 
+0

的確,常規接受語法,而不把它考慮的事實是非常容易引起誤解。 謝謝你的解決方案,它工作得很好。 –