本文介紹了休眠標準:DISTINCT ENTITIES、FETCH JOIN和MaxResults的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
當我從根元素(例如Company)向集合(例如Employees)發(fā)出帶有fetchMode聯(lián)接和Alias Left_out_Join的條件請求時,我無法對不同的公司進行分頁(使用MaxResults和FirstElement)。
criteria = sessionFactory.getCurrentSession().createCriteria(Company.class);
criteria.createAlias("employees", "employees", JoinType.LEFT_OUTER_JOIN);
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
criteria.setFetchMode("employees", FetchMode.JOIN);
criteria.setFirstResult((pageNb - 1) * nbPerPage);
criteria.setMaxResults(nbPerPage);
如果我要求前20家公司,我只有3家,因為第一個結(jié)果有18名員工。
我希望得到要求的前20名,但員工要加載以優(yōu)化延遲加載。
推薦答案
我發(fā)現(xiàn)這個post也有類似的情況。當您將結(jié)果限制在一個條件中時,Hibernate將在SQL查詢中應(yīng)用該限制,而當您使用聯(lián)接/DISTINCT根實體時,在許多情況下,它將導(dǎo)致較小的結(jié)果列表。您報告的結(jié)果證實了這一點。
建議的解決方法是將別名的獲取模式更改為SELECT
。結(jié)果是將調(diào)用多個查詢,但肯定比每個元素的延遲加載成本更低。
這篇關(guān)于休眠標準:DISTINCT ENTITIES、FETCH JOIN和MaxResults的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,