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。
但這不是方便,任何人都可以幫助弄清楚如何提高查詢與休眠?
非常感謝。
爲什麼不能做一個連接抓取像'從一個連接抓取AB WHERE a.id IN (:ids)' –
@ChristianBeikov我試過這似乎是從休眠日誌,查詢是'session.createQuery(「FROM A JOIN FETCH ab WHERE a.id IN(:ids)」)。setParameterList(「 ids「,ids).list()',但我只能從查詢中得到一個A,實際上它的大小應該是100.你知道它爲什麼會發生嗎? – Junjie
@ChristianBeikov它是由標記''造成的嗎? –
Junjie