本文介紹了休眠標(biāo)準(zhǔn):DISTINCT ENTITIES、FETCH JOIN和MaxResults的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
當(dāng)我從根元素(例如Company)向集合(例如Employees)發(fā)出帶有fetchMode聯(lián)接和Alias Left_out_Join的條件請(qǐng)求時(shí),我無(wú)法對(duì)不同的公司進(jìn)行分頁(yè)(使用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家,因?yàn)榈谝粋€(gè)結(jié)果有18名員工。
我希望得到要求的前20名,但員工要加載以?xún)?yōu)化延遲加載。
推薦答案
我發(fā)現(xiàn)這個(gè)post也有類(lèi)似的情況。當(dāng)您將結(jié)果限制在一個(gè)條件中時(shí),Hibernate將在SQL查詢(xún)中應(yīng)用該限制,而當(dāng)您使用聯(lián)接/DISTINCT根實(shí)體時(shí),在許多情況下,它將導(dǎo)致較小的結(jié)果列表。您報(bào)告的結(jié)果證實(shí)了這一點(diǎn)。
建議的解決方法是將別名的獲取模式更改為SELECT
。結(jié)果是將調(diào)用多個(gè)查詢(xún),但肯定比每個(gè)元素的延遲加載成本更低。
這篇關(guān)于休眠標(biāo)準(zhǔn):DISTINCT ENTITIES、FETCH JOIN和MaxResults的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,