Díky za tip. Tenhle způsob používám zřídka spíš pro speciální věci, ale zkusím to.
---------- Původní zpráva ---------- Od: Ondra Medek <xmed...@gmail.com> Datum: 29. 4. 2013 Předmět: Re: hibernate-critera s withClause " Ahoj, zkus SqlQuery. 2013/4/29 Miroslav Paulfranc <paul...@seznam.cz(mailto:paul...@seznam.cz)> " Ahoj. " tak by se kolekce permissions vrátila jen napůl plná" - to je to, co potřebuju, nechci všechny permissions. SQL dotaz vrací přesně to, co potřebuju, jen není kolekce načtená. Chci "všechny Person, které mají Permission X" a "od nalezených Person právě ty, s Permissions X" a v mém případě i Person bez Permissions. Dejme tomu budu chtít všechny uživatele bez oprávnění a zároveň uživatele, kteří mají neplatná oprávnění , tj. chci, aby se mi vrátil např. uživatel A, který nemá žádné oprávnění a uživatel B s nějakými oprávněními, ale neplatnými. Díky za odpověd. ---------- Původní zpráva ---------- Od: Petr Janata <petrjan...@gmail.com(mailto:petrjan...@gmail.com)> Datum: 29. 4. 2013 Předmět: Re: hibernate-critera s withClause " 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(mailto: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. " " " -- Ondra Medek "