我正在使用非常複雜的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。
謝謝。
使用標準複雜的查詢(特別是多連接)將導致性能問題,我懷疑你可以做多改善它。您應該使用Hibernate原生查詢,這裏解釋https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html –
@dsp_user感謝您的SQL查詢引用。我嘗試過這個。但正如問題中提到的,我有很多加入集合(實際上我有4個集合加入嵌套)。從第二級加入起,我收到了一個空集。另外,我得到的A實體的拷貝比預期的多(從數據庫返回的行)。我在新查詢中使用SQLQuery.addEntity(String,Class)和SQLQuery.addJoin(String,String)。 – AJA