1
我有一個表用戶有100個記錄。如何在hibernate中使用批處理獲取子tabes?
我有200個記錄稱爲用戶角色的子表(每個用戶2個)。
如果我得到所有用戶,然後運行100個查詢。
我使用List userList = session.createCriteria(User.class).list();
有沒有一種方法來優化它。
我有一個表用戶有100個記錄。如何在hibernate中使用批處理獲取子tabes?
我有200個記錄稱爲用戶角色的子表(每個用戶2個)。
如果我得到所有用戶,然後運行100個查詢。
我使用List userList = session.createCriteria(User.class).list();
有沒有一種方法來優化它。
您描述的問題被稱爲n + 1選擇問題。
Hiberante提供了幾種不同的方式來處理它。對他們來說,就是將獲取模式設置爲EAGER的關係,從而導致問題。 假設一個一對多表用戶和表之間的UserRole映射被稱爲「的UserRole」:
Criteria criteria = session.createCriteria(User.class);
criteria.setFetchMode("userRoles", FetchMode.EAGER);
List userList = criteria.list();
這並不解決問題又來了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
的確,您應該使用FetchMode.JOIN而不是FetchMode.EAGER。 – mateuszlo
你能提供一些更多的信息:你的User和UserRoles實體是怎樣的?以及這100個查詢的樣子是怎樣的? – mateuszlo