2016-08-23 39 views
1

我有一個表用戶有100個記錄。如何在hibernate中使用批處理獲取子tabes?

我有200個記錄稱爲用戶角色的子表(每個用戶2個)。

如果我得到所有用戶,然後運行100個查詢。

我使用List userList = session.createCriteria(User.class).list();

有沒有一種方法來優化它。

回答

0

您描述的問題被稱爲n + 1選擇問題。

Hiberante提供了幾種不同的方式來處理它。對他們來說,就是將獲取模式設置爲EAGER的關係,從而導致問題。 假設一個一對多表用戶和表之間的UserRole映射被稱爲「的UserRole」:

Criteria criteria = session.createCriteria(User.class); 
criteria.setFetchMode("userRoles", FetchMode.EAGER); 
List userList = criteria.list(); 
+0

這並不解決問題又來了100查詢與用戶表上運行外連接的用戶角色。此外,該渴望加入顯示爲deprecated.public static final FetchMode DEFAULT = new FetchMode(「DEFAULT」); \t public static final FetchMode JOIN = new FetchMode(「JOIN」); \t public static final FetchMode SELECT = new FetchMode(「SELECT」); \t/**棄用*/ \t public static final FetchMode LAZY = SELECT; \t/**棄用*/ \t public static final FetchMode EAGER = JOIN; – user3302323

+0

的確,您應該使用FetchMode.JOIN而不是FetchMode.EAGER。 – mateuszlo

+0

你能提供一些更多的信息:你的User和UserRoles實體是怎樣的?以及這100個查詢的樣子是怎樣的? – mateuszlo

相關問題