2013-07-11 34 views
2

我在Hibernate.Say報表和項目表中有一對多關係。一個報表有很多項目和項目可以處於活動或不活動狀態。需要使用Active項目獲取所有報告。一對多將填補所有的子記錄忽略條件中的條件

Class Report{ 
    @OneToMany(mappedby="reports") 
    List<Projects> projList; 
    /*get and set methods */  
} 

Class Project{   
    @ManyToOne 
    Report repors; 
    /*get and set methods */   
    /*This is a column which represenst ACTIVE or NOT*/ 
    private status; 
}   

我試圖把所有與活動項目的報告,我的標準是這樣的:

List<Reports> reportsList = Criteria(Reports.class) 
     .createAlias("projList","projList",INNER_JOIN) 
     .add(Restrictions.eq("projList.status","ACTIVE")).list() 

當我遍歷了reportsList並獲得相應的項目它返回我所有的項目與ACTIVE或INACTIVE無關。

for(Report rep:reportsList){ 
    rep.getProjList(); 
    //This is returning me all the projects irresective of my criteria for 
// ACTIVE projects. This is hitting another query to the table with the report id 
//only but not with the status= ACTIVE.So this is returning me all the Projects. 
} 

但是,當我做一個左外部連接,而不是內部連接,我收到正確的結果,即只有ACTIVE項目。我不知道爲什麼?

你能解釋我是如何,它是否正確,它會在所有情況下consitent? 或我應該加載活動項目,並獲得相應的報告對項目具有 即標準(從子到父)

+0

只是一個筆記狀態數據類型丟失。 –

回答

2

創建一個只讀設置成你的Report實體將包含僅在活動項目,使用一個where clause

@OneToMany(mappedby="reports") 
@Immutable 
@Where(clause="status='ACTIVE'") 
List<Projects> activeProjList; 

重要的是要爲只讀這個集合,因爲你已經確保在你的實體的一致性,所以修改必須INT您的收藏projList來完成。

關於註釋對不起,如果有任何錯誤,我通常使用xml映射文件。

+0

非常感謝您的重播。如果我這樣做,那麼我的列表將始終具有ACTIVE項目,並且我將無法將該列表用於其他條件。例如:爲給定報表加載所有項目,而不考慮條件/與其他條件。 – user2573439

+0

我不是說只有這個集合。我說你可以有這個和你的原始項目列表。然後,當您需要整個項目列表時,它也可用,並且也是活動項目列表,但僅用於閱讀目的。您只能在原始列表中進行修改。 –