2012-08-17 71 views
1

我有類似的代碼如下: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從...

+1

如果我理解正確的, 「懶加載」 可能是你在找什麼。 – jrochette 2012-08-17 14:10:42

+0

首先調整你的sql查詢,然後轉換成Hibernate查詢。幾件事情,儘量避免使用「重大」的重複,也儘量減少連接的數量。 – 2012-08-17 14:11:45

+0

但是不會延遲加載本質上運行相同的附加查詢?我不確定是否要在POJO上運行急切加載,因爲其他代碼使用該類,並且不需要這些附加對象。這就是爲什麼我希望我可以在查詢中做到這一點(雖然不是返回一個Foo,我想它會返回一個String [],其中col1是關鍵字,col2是值) – user973479 2012-08-17 14:13:11

回答

0

據我瞭解你的問題,你不希望有收集默認渴望但在這些具體案例/方法在一個查詢中全部獲取?!

這裏是Hibernate文檔中關於這個片段:

A「取」加入允許值的協會或收藏與使用單個選擇它們的父對象一起被初始化。這在收集的情況下特別有用。它有效地覆蓋了關聯和集合映射文件的外連接和惰性聲明。有關更多信息,請參見第19.1節「獲取策略」。

from Cat as cat 
    inner join fetch cat.mate 
    left join fetch cat.kittens 

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html