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.