Zdravím Mirku, problém je to prastarý (2005) a samotný tvůrce Gavin King se k němu vyjádřil<https://forums.hibernate.org/viewtopic.php?t=944439>. (Doporučuji dočíst thread do konce, kde je nádherný flame)
Prakticky chceš asi dosáhnout tohoto: Najdi všechny Person, které mají Permission X A ZÁROVEŇ vrať od nalezených Person všechny Permissions. To jedním joinem nepůjde, protože Permission musí být X a některé tím pádem ve výsledku nebudou, což je v rozporu s druhou polovinou požadavku, že se mají vrátit všechny. Kdyby v třídě *JoinWalker *nebyla podmínka *&& ! oj.hasRestriction(), *tak by se kolekce permissions vrátila jen napůl plná. Musíš to bohužel napsat explicitně: nejdřív zjistit, které Person entity chceš a pak k nim dotáhnout všechny jejich permissions. Zkusil bych: 1. 2 query, v první vybrat vhodné Person a pak k nim dotáhnout permissions v druhé query 2. použít Criteria.ALIAS_TO_ENTITY_MAP<http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associations>a udělat si mapovací práci ručně v paměti 3. mohlo by i fungovat FetchMode.SELECT, nebo subquery Petr Janata 2013/4/29 Miroslav Paulfranc <paul...@seznam.cz> > Zdravím všechny přítomné. > Narazil jsme v Hibernate (3.6 a 4.0) na problém týkající se Criteria API - > konkrétně jde o dotahování objektu s kolekcí. > > Situace je následující: > Mám dejme tomu třídu Person a ta má kolekci Permissions, která je v hbm > označena jako lazy loaded (lazy="true"). > > Pokud chci jedním SQL dotazem načíst osobu s kolekcí oprávnění, použiji: > > *DetachedCriteria criteria = DetachedCriteria.forClass(Person .class, > "person"); > criteria.createCriteria("permissions", "permission", > DetachedCriteria.LEFT_JOIN);* > > objekt třídy Person je potom natažen v rámci jednoho SQL dotazu včetně > Permissions. > > Pokud chci do podmínky k části join cokoliv přidat (např. omezit na platné > perm. kde validDateTo=null), použiju metodu > DetachedCriteria<http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html> > *createCriteria<http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html#createCriteria%28java.lang.String,%20java.lang.String,%20int,%20org.hibernate.criterion.Criterion%29> > *(String<http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true> > associationPath, > String<http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true> > alias, > int joinType, > Criterion<http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/Criterion.html> > withClause) > tj. > *criteria.createCriteria("permissions", "permission", > DetachedCriteria.LEFT_JOIN, nějakáPodmínka);* > > ,pak je generován SQL dotaz přesně tak, jak bych čekal > (dotaz z konkrétní aplikace*: left outer join dbo.zadost_data > zadostdata1_ on this_.zadost_id=zadostdata1_.zadost_id and ( > zadostdata1_.vt is not null )*) > , ale bohužel se nedotáhne kolekce permissions a pokus o přečtení končí > výjimkou *LazyInitializationException*.. > > Zkoušel jsem i nastavovat fetchMode ale bez úspěchu.. > > Ověřoval jsem na několika aplikacích a všude se stejným výsledkem. > > Metoda s parametrem Criterion byla přidána relativně "nedávno" (v 3.2. > myslím nebyla). > > Připadá mi, že pokud přidám withClause, ignoruje se potom fetch mode. > Tušíte prosím, jestli se dá přidat do join části nějakým jiným způsobem > další podmínka? > > Mimochodem; např. v Hibernate třídě *JoinWalker* jsou variace na podmínku > * > * > *if ( oj.getJoinType()==JoinType.LEFT_OUTER_JOIN && ! oj.hasRestriction()) { > //it must be a collection fetch > collectionPersisters[j] = collPersister; > collectionOwners[j] = oj.getOwner(associations); > j++; > }* > > kde *hasRestriction* indikuje použití podmínky withClause, tak nevím, > jestli to nemůže souviset s tímto problémem.. > > Předem děkuji za odpověd. > M.P. > > > > > > > >