2017-10-05 74 views
0

我正在使用非常複雜的Hibernate Criteria從我的數據庫中獲取數據。如何使用Hibernate Criteria從db中提取字段?

假設我有以下實體A,B,C,d(其實我有很多這樣的實體),並讓自己的班級是

A{ 
    /*some other fields*/ 
    private String key; 
    private List<B> bList; 
} 

B{ 
    /*Some other fields*/ 

    private Set<C> cSet; 
} 

C{ 
    /*Some other fields*/ 
    private D d; 
} 

D{ 
    /*Some fields*/ 
} 

而讓我用它來獲取準則是

Criteria criteria = getCurrentSession().createCriteria(A.class); 
criteria.add(Restrictions.eq("key", "myKey")); 

criteria.setFetchMode("bList", FetchMode.JOIN); 
criteria.setFetchMode("bList.cSet", FetchMode.JOIN); 
criteria.setFetchMode("bList.cSet.d", FetchMode.JOIN); 

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

A a = criteria.uniqueResult(); 

這工作正常,我得到的結果。但正如我已經提到的,這是我的實際查詢的一個非常簡化的版本。我的實際查詢有很多這樣的連接提取,它會導致性能問題。我無法避免這種JOIN獲取模式,因爲應用程序立即需要這些字段。我檢查了被解僱的數據庫的查詢。所有A,B,C和D中的很多字段都是從db中獲取的,而這些不是必需的。我試圖阻止這些字段的獲取。我試圖Example.excludeProperty()提到here。我不縮短查詢。當我使用投影時,我不得不寫一個自定義結果轉換器。這個問題有沒有簡單的解決方案?我正在使用PostgreSQL。

謝謝。

+0

使用標準複雜的查詢(特別是多連接)將導致性能問題,我懷疑你可以做多改善它。您應該使用Hibernate原生查詢,這裏解釋https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html –

+0

@dsp_user感謝您的SQL查詢引用。我嘗試過這個。但正如問題中提到的,我有很多加入集合(實際上我有4個集合加入嵌套)。從第二級加入起,我收到了一個空集。另外,我得到的A實體的拷貝比預期的多(從數據庫返回的行)。我在新查詢中使用SQLQuery.addEntity(String,Class)和SQLQuery.addJoin(String,String)。 – AJA

回答

0

excludeProperty應該以這種方式被應用---

Example example = Example.create(A).excludeProperty("property1") 
       .excludeProperty("property2"); 
Criteria criteria = getCurrentSession().createCriteria(A.class) 
        .add(example); 
criteria.add(Restrictions.eq("key", "myKey")); 

criteria.setFetchMode("bList", FetchMode.JOIN); 
criteria.setFetchMode("bList.cSet", FetchMode.JOIN); 
criteria.setFetchMode("bList.cSet.d", FetchMode.JOIN); 

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

A a = criteria.uniqueResult(); 
+0

我不明白使用變量'example'。 – AJA

+0

對不起,我一直在更新答案。 – Zigri2612

+0

感謝您的努力。但這正是我用'Example'試過的,它似乎並沒有減少對數據庫的查詢。 – AJA

相關問題