2014-07-16 87 views
-1

我需要從查詢中獲取數據,這將檢索實體A,實體B和實體C的樹ID自定義字段。這樣Hibernate將非託管實體與託管實體合併

SELECT 
    a.id_entityA, 
    b.id_entityB, 
    c.id_entityC, 
    sum(some) * sum(another), 
    avg(of_some) * any_factor, 
    another_operations, 
From ... Many Selects, joins, etc 

某事,這檢索像

54 | 80 | 60 | 5421 | 56474.4 | 4540 

在休眠的信息,我創建的SQLQuery來獲取信息的DTO

public class ExampleDTO { 
    private Integer idA; 
    private Integer idB; 
    private Integer idC; 

    private Number fieldX; 
    private Number fieldY; 
    private Number fieldZ; 

    //getters and settters 
} 

在查詢執行我添加使用ResultTransformer

.setResultTransformer(Transformers.aliasToBean(ExampleDTO.class)) 

還有作品!!!

但是,我需要實體A,B和C的另一個領域,

public class ExampleDTO { 
// bottom of fields 
    private EntityA entityA; 
    private EntityB entityB; 
    private EntityC entityC; 
// news and olds getters and setters 

所以我在bucle閱讀本填寫

for(ExampleDTO e : list) 
{ 
    e.setEntityA(entityADao.getById(e.getIdA()); 
    e.setEntityB(entityBDao.getById(e.getIdB()); 
    e.setEntityC(entityCDao.getById(e.getIdC()); 
} 

作品,但其老式的低性能獲取數據的方式。

有得到在同一查詢三個實體部分神奇方式,只需要運行第一個查詢並做 bluce來填補我的DTO

編輯列表 假設這EntityAEntityBEntityC,都anoted與@Entity

+1

如果我正確理解你要做的事情,你希望運行一個查詢來獲得三個實體,並且運行SQL命令來執行數學計算,所有這一切都在一次查詢中完成。上次我使用Hibernate時,我相信在HQL或Criteria/getById()中不可能執行任意SQL公式。也就是說,你必須選擇是否運行SQL,或者讓Hibernate執行它的ORM魔法,但是不能一次執行這兩個操作。但這可能不再準確...... – Tim

回答

0

沒有有聚集的預測和獲取實體神奇的方式。無論如何,您必須手動將所有提取的實體屬性包含在group by子句中。

如果實體不相關,最終會得到一個笛卡爾積,這更加麻煩。

我的建議是運行投影查詢並獲取這些ID並利用二級緩存來優化附加實體檢索(但不通過運行查詢,它將繞過第二級緩存),當找到實體:

session.get(EntityA.class, 1L); 
session.get(EntityB.class, 1L); 
session.get(EntityC.class, 1L); 

如果實體相關的,你可以嘗試使用第二個連接查詢選擇一些/所有實體,但是這將需要讓所有的實體引用彼此。