2011-01-11 114 views
4

我有一個域對象,費用,有一個字段名爲initialFields休眠條件與投影不執行查詢@OneToMany映射

它標註爲這樣:

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true) 
@JoinTable(blah blah) 
private final List<Field> initialFields; 

現在我試圖用突起以僅拉動某些領域由於性能原因,但是當這樣做的initialFields場總是空。這是唯一的OneToMany字段,也是我試圖用這種方式進行投影檢索的唯一字段。如果我使用常規HQL查詢initialFields進行適當填充,但我當然不能限制這些字段。

部分投影代碼:

Criteria criteria = session.createCriteria(Payment.class); 
criteria.createAlias("expense", "e"); 

ProjectionList properties = Projections.projectionList(); 
//Some restrictions and more fields 
properties.add(Projections.property("e.initialFields"), "initialFields"); 
criteria.setProjection(properties); 
criteria.setFetchMode("e.initialFields", FetchMode.JOIN); 
criteria.setReadOnly(true); 
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class)); 

return criteria.list(); 

當我打開調試,打開顯示SQL,拉initialFields查詢不會出現創建/運行。任何人見過這樣的事情?

我剛剛嘗試使用HQL投影,通過指定每個字段我想拉,然後手動建立對象。在這種情況下,由Hibernate構建的SQL對於initialFields字段不正確。 expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_. as col_2_0_ is其中initialFields將被拉。我的猜測是它應該是expense1_.id as col_2_0_

編輯:我剛剛刪除了Result Transformer來檢查每個屬性,並且initialFields屬性確實爲null。

回答

3

我有類似的問題,對我來說,在標準中明確指定joinType

Criteria criteria = session.createCriteria(Payment.class); 
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN); 
+0

有趣的是,如果我回到那個代碼,我將不得不嘗試這個。謝謝 – Josh 2011-03-17 12:21:39