我有類似的代碼如下:Hibernate查詢優化
public void doQuery(final Baz baz){
final Query query = getSessionFactory().getCurrentSession().createQuery(
"select distinct foo from Foo as foo "+
"join foo.a as a"+
"join foo.b as b "+
"join b.c as c "+
"where baz=:baz"
);
query.setParameter("baz", baz);
final List<Foo> list = query.list();
for (final Foo foo : list) {
final Set<C> cSet = foo.getB().getCs();
final String value = foo.getSomeValue();
for (final C c : cSet) {
final Long key = c.getSomeLong();
// Do stuff with key and value
}
}
}
每次的循環執行,它將運行額外的Hibernate查詢幕後拉額外的數據(因爲對象是標記爲延遲加載)。不希望將這些對象切換爲渴望,因爲使用POJO的其他類不需要該數據。
顯然上面的代碼可能會產生一個我想避免的瓶頸。是否存在修改查詢以僅以一次性方式恢復必要數據的特定於hibernate的方式(即沒有本機SQL)?
我很好具有查詢返回的String [] []與COL1的關鍵和COL2的價值,而不是返回富
更新:
我改變了查詢,只是回報必要
鍵/值「選擇不同的c.id,foo.someValue從...
如果我理解正確的, 「懶加載」 可能是你在找什麼。 – jrochette 2012-08-17 14:10:42
首先調整你的sql查詢,然後轉換成Hibernate查詢。幾件事情,儘量避免使用「重大」的重複,也儘量減少連接的數量。 – 2012-08-17 14:11:45
但是不會延遲加載本質上運行相同的附加查詢?我不確定是否要在POJO上運行急切加載,因爲其他代碼使用該類,並且不需要這些附加對象。這就是爲什麼我希望我可以在查詢中做到這一點(雖然不是返回一個Foo,我想它會返回一個String [],其中col1是關鍵字,col2是值) – user973479 2012-08-17 14:13:11