2013-04-04 94 views
3

我有一個Detectable類與Revisions集,這是Hibernate管理POJO。我還使用hbm.xml文件映射我的實體。當用戶轉到Detectable管理屏幕時,我想讓他看到Detectable數據放到一張表中,其中也包含最後的Revision完成。但是,完整的修訂集只能訪問可檢測的詳細頁面。休眠派生屬性與XML映射

我的機會是顯示最後修訂日期,它將作爲每個Detectable實例的屬性單獨加載。所以,我有這樣的事情:

detectable.hbm.xml

<set name="_Revisions" table="trevision" inverse="true" lazy="true"> 
    <key> 
     <column name="id_detectable" /> 
    </key> 
    <one-to-many class="com.company.model.tasks.Revision" /> 
</set> 

<property name="_LastRevisionDate" 
     formula="select max(rev.start_date) from trevision rev where rev.id_detectable = _Id" 
     type="date" /> 

這不工作,我有一個SQL語法錯誤當Hibernate試圖執行包含在公式查詢。我在不同的地方看到,使用standard SQLHQL可以達到這個屬性,但是我都失敗了。也只能按日期順序實現整個Revision實體(我的意思是最後一次修訂)嗎?

將您的想法集中起來!

回答

4

我最後用這個代碼實現它:

<property name="_LastRevisionDate" 
     formula="(select MAX(rev.start_date) from trevision rev where rev.id_detectable = id_detectable and rev.status != 'DRAFT')" 
     type="date" /> 

哪裏id_detectable是我目前的實體鍵列。


UPDATE

另一個解決辦法是use a DB view獲得最後修訂日期。然後,可以選擇將實體映射到該視圖而不是原始表。

1

什麼是sql語法錯誤?您是否嘗試用id替換_Id

+0

我試過了。 sql語法錯誤與在公式中寫入的查詢有關,不會提供更多信息。我無法找到關於派生屬性的更多信息,但是[鏈接](http://learningviacode.blogspot.com.es/2011/09/using-derived-properties.html)表明也可以使用hql 。我會檢查。 – 2013-04-04 19:12:15

+1

我剛剛在我們的應用程序中查看了一些公式屬性,它們都包裝在parens中:'formula =「(...)」'。也許值得嘗試一下。 – 2013-04-04 19:20:39

+0

HQL或SQL?你如何引用你當前實體的id,按列名或屬性? – 2013-04-04 19:24:18