2011-10-25 25 views
2

我已經在類級別用@Where屬性註釋了一個Hibernate實體。 這限制了直接查詢它時加載哪些實體,但它似乎不適用於該類的集合。這是預期的嗎?Hibernate - class level @Where註解是否在該類的集合上執行?

該文檔不明確在此:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class

其中(可選):指定的任意的SQL WHERE條件是檢索這個類的對象時使用 。

這聽起來像它適用於所有的情況下,該類的對象被檢索,但我觀察到這被忽略的集合。

  1. 這是爲了收藏而工作嗎?
  2. 如果不是,將全部過濾器應用到類的所有實例以及該類的所有集合的最佳方法是什麼?

(更新:我提出https://hibernate.atlassian.net/browse/HHH-6781跟蹤文檔的問題)

+0

看起來它應該工作對於收藏品,但如果不收藏,文檔應該明確說明。我已經提出https://hibernate.onjira.com/browse/HHH-6781 – Rich

+0

我遇到同樣的問題,但直接通過Criteria API作爲'createCriteria(MyEntity.class).scroll()'查詢類。您使用的是什麼方法,HQL或Criteria API? – Vlad

+0

我使用的是標準:列表(),而不是滾動(),但我不希望有所作爲。 – Rich

回答

1

@Where在類級別將使用「GETALL」或「LOADALL」時省略了不必要的實例。在課堂上有@Where將不會「級聯」應用於該實體的集合。

@Where在集合屬性級別 公共類PuppySeller {

@Where(clause = "status='FOR_SALE'") 
    public Set<Puppy> getPuppiesForSale() {} 

將確保,當你從數據庫中選擇「PuppySeller」,「puppiesForSale」只會被小狗的「供銷售」填充狀態。

但是,要非常謹慎,因爲它只適用於一級集合。我的意思是說你有一隻小狗,並且你想讓所有的小狗由同一個賣主出售。你可能會做一些像「myPuppy.getPuppySeller()。getPuppiesForSale()」。但是,如果你這樣做,你將最終得到屬於puppySeller的所有小狗,包括所有「已售出」或「新生兒」的小狗,等等。

+0

謝謝。我認爲這主要是一個文檔錯誤。儘管將行爲改變爲我所期望的有時會有所幫助,但我認爲這可能會打破公元前。我已經提出了此票來跟蹤文檔修復:https://hibernate.atlassian.net/browse/HHH-6781 – Rich