2015-12-03 42 views
1

我有兩個名爲A和B的類.B的主鍵是tab_A的字段。映射XML是這樣的:如何改進hibernate查詢?

<hibernate-mapping> 
    <class name="com.fabulous.A" table="tab_A"> 
     <id name="id" column="id"> 
      <generator class="assigned" /> 
     </id> 
     <property name="userId" column="user_id" /> 

     <many-to-one name="B" column="B_id" 
      class="com.fabulous.B" unique="true" lazy= "false" cascade="merge"> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

而且,還有另一個XML映射其映射B類表B. 在我的應用程序的查詢是:

session.createQuery("FROM A WHERE id IN (:ids)").setParameterList("ids", ids).list(); 

的參數是A清單ID。列表的大小是100;

lazy = true時,查詢時間約爲1秒,但應用A.b時約需1分鐘。其實B將永遠是必需的,所以我關閉延遲加載。查詢時間約爲40秒。

從休眠日誌中,休眠從表B逐個加載B但不是批量加載。我想如果我在查詢中提取表A中的所有B.id,然後在批內查詢表B,那麼總時間將小於3s。

但這不是方便,任何人都可以幫助弄清楚如何提高查詢與休眠?

非常感謝。

+1

爲什麼不能做一個連接抓取像'從一個連接抓取AB WHERE a.id IN (:ids)' –

+0

@ChristianBeikov我試過這似乎是從休眠日誌,查詢是'session.createQuery(「FROM A JOIN FETCH ab WHERE a.id IN(:ids)」)。setParameterList(「 ids「,ids).list()',但我只能從查詢中得到一個A,實際上它的大小應該是100.你知道它爲什麼會發生嗎? – Junjie

+0

@ChristianBeikov它是由標記''造成的嗎? – Junjie

回答

1

要預先抓取的查詢有一定的關係只是做一個簡單的JOIN FETCHLEFT JOIN FETCH如果關係是可選的像

FROM A a JOIN FETCH a.B WHERE a.id IN (:ids)