2016-12-06 56 views
0

我有RequestRequestSet(單個用戶同時提交的各個請求的集合)和請求Status的域類。我想彙總請求的狀態,以便請求集具有根據其各個請求的狀態確定的狀態。可能使用Grails派生屬性來檢索域對象嗎?

這些域類的相關部分如下所示:

class RequestSet { 
    Long id 
    static hasMany = [requests: Request] 
} 

class Request { 
    Long id 
    Status status 
} 

class Status { 
    Long id 
    String status 
} 

我嘗試添加派生status屬性爲RequestSet類,像這樣:

class RequestSet { 
    Long id 
    Status status 
    static hasMany = [requests: Request] 

    static transients = ['status'] 

    static mapping = { 
     status formula: '(SELECT MIN(status_id) FROM (SELECT status_id FROM request rq WHERE rq.request_set_id = id))' 
    } 
} 

當我運行我的應用程序和檢查requestSet對象的屬性,但是,狀態都是空的。

我試圖完成甚至可能使用派生屬性?我可以使用getter來解決瞬態屬性問題,但我希望能夠使用動態查找器根據其冒泡狀態來檢索requestSets。我所見過的所有例子都使用公式的結果。我想知道如果我能以某種方式讓Grails將該返回值解釋爲Status類的ID。

編輯,2016年12月7日:請注意,我將衍生status屬性標記爲瞬態。如果不這樣做,我會從Hibernate獲得ClassCastException

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'transactionManager_companion' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager_companion': Cannot resolve reference to bean 'sessionFactory_companion' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory_companion': Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

我懷疑即使公式的作品,因爲它被標記爲瞬態我將無法使用動態查找與此屬性。我會解決使用公式來計算身份的身份證,但我仍然有問題。

現在我的領域類看起來是這樣的:

class RequestSet { 
    Long id 
    Long statusId 
    static hasMany = [requests: Request] 

    static mapping = { 
     statusId formula: '(SELECT MIN(status_id) FROM (SELECT rq.status_id FROM request rq WHERE rq.request_set_id = id))' 
    } 
} 

獲取請求集時由下式生成的SQL是

(SELECT MIN(this_.status_id) FROM (SELECT rq.status_id FROM request rq WHERE rq.request_set_id = this_.id)) as formula3_0_ from request_set 

,我得到一個SQLSyntaxErrorExceptionORA-00904: "THIS_"."STATUS_ID": invalid identifier。我怎樣才能重寫公式,使'this_。'是不是預先給status_id?

回答

0

迴應我原來的問題,不,你不能使用公式來派生屬於另一個域類的屬性。我多次失敗的嘗試都讓我得出了這個結論,this blog的作者似乎也這麼認爲。具體來說,「派生屬性可以是Hibernate支持的任何類型」,而我的Status類不是。

至於我的後續問題,根據this answer for a different question,我使用的公式不支持HQL。我設法用這個公式,而不是得到statusId作爲派生屬性:

(SELECT MIN(status.id) FROM status WHERE status.id IN (SELECT rq.status_id FROM request rq WHERE rq.request_set_id = id)) 

感謝@Mike的建議,打開SQL日誌記錄。這真的有助於弄清楚發生了什麼。