Re: CZJUG Praha - The Closure Tools s použitím Mavenu a IntelliJ IDEA, Jak na scénáře aneb sebevražda v Bronxu
Ahoj, bohuzel pro nemoc Lukase Vlcka probehne pouze prezentace Richarda Sereho: Jak na scénáře aneb sebevražda v Bronxu. Diky za pochopeni. -- S pozdravem Roman Dagi Pichlik /* http://dagblog.cz/ Blog pro kodery */ 2013/4/20 Roman Pichlík roman.pich...@gmail.com: Zdravim, Dubnové setkání Pražské Czech Java User Group proběhne 29.4. od 19h v posluchárně S5 na Matematicko-fyzikální fakultě Karlovy Univerzity na Malostranském náměstí 25, Praha 1. Čekají nás dvě prezentace: The Closure Tools s použitím Mavenu a IntelliJ IDEA(Lukáš Vlček) a Jak na scénáře aneb sebevražda v Bronxu (Richard Šerý). Vstup na akce CZJUGu je zdarma, a není třeba se předem registrovat. Pokud se chystáte přijít, dejte nám vědět formou hlasování v anketě na hlavní stránce portálu java.cz. The Closure Tools s použitím Mavenu a IntelliJ IDEA Chcete začít s Closure Tools a nevíte jak? Jste Java vývojář, používáte maven a nechce se Vám kvůli JavaScriptu přesedlat na zcela jiný dev stack? Tak přijďte, a ukážu Vám, jak jsem začal já, aniž bych musel příliš opouštět pohodlí zaběhané dílny Java vývojáře. Nejdřív se trochu podíváme na Closure Library a pokusím se zavzpomínat na největší překvapení, která na nováčky čekají. Podíváme se také na Closure Templates (aka. Soy Templates). Vyrobíme jednoduchou aplikaci včetně testů, která se bude buildovat s použitím mavenu. O přednášejícím: Lukáš Vlček pracuje v Brně pro společnost Red Hat. Zabývá se technologií Elasticsearch a vývíjí full-text search službu http://search.jboss.org/ Současný frontend této služby napsal v nouzi s pomocí jQuery a několika dalších JS pluginů. Brzy zjistit, že tudy cesta nevede. V součásné době frontend přepisuje v Closure Library a myslí si, že činí dobře. Jak na scénáře aneb sebevražda v Bronxu Sestavování scénářů a zadávání úkolů bývá často Achillovou patou vývojového procesu, bez ohledu na to, zda tým vyvíjí podle agilních nebo tradičních metodik. Přednáška shrnuje deset let praktických zkušeností se scénáři a chybami při jejich přípravě. Vývojáři se seznámí s různými zdroji problémů a s technikami, které nám pomáhají tyto problémy překonávat. O přednášejícím: Richard Šerý pracuje jako designér uživatelských rozhraní ve firmě AspectWorks. V uplynulých deseti letech pracoval na projektech všech druhů a velikostí pro firmy jako je Hypoteční banka, DHL, Annonce, O2 či Siemens. Mezi jeho specializace patří informační architektura, design, testy použitelnosti, Javascript a CSS. -- S pozdravem Roman Dagi Pichlik /* http://dagblog.cz/ Blog pro kodery */
hibernate-critera s withClause
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.
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řilhttps://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_MAPhttp://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associationsa 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 DetachedCriteriahttp://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html *createCriteriahttp://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 *(Stringhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true associationPath, Stringhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true alias, int joinType, Criterionhttp://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.
Re: hibernate-critera s withClause
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 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.
Re: hibernate-critera s withClause
Ahoj, zkus SqlQuery. 2013/4/29 Miroslav Paulfranc 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 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_MAPhttp://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associationsa 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 DetachedCriteriahttp://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html *createCriteriahttp://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 *(Stringhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true associationPath, Stringhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true alias, int joinType, Criterionhttp://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
Re: hibernate-critera s withClause
Tady myslím se vyjádřil Gavin King přesně: It cannot be done and it should not be done and you are trying to do a *Bad Thing*. ORM transparentní není a nebude. *See inline* 2013/4/29 Miroslav Paulfranc 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. *Co by se mělo dít, když na entitě znovu zavoláš EntityManager.merge() nebo persist()? Mají se ty nedotažené permissions smazat?* SQL dotaz vrací přesně to, co potřebuju, jen není kolekce načtená. *Jak sám píšeš, kolekce není načtená - LazyInitializationException** * 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 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_MAPhttp://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associationsa 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 DetachedCriteriahttp://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html *createCriteriahttp://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 *(Stringhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true associationPath, Stringhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true alias, int joinType, Criterionhttp://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*
Re: hibernate-critera s withClause
S nedotaženými kolekcemi pracuju pořád, implementuju tak kompletní historii, tzn. pokud chci někde historii, mám master tabulku na kterou odkazuju z ostatních tabulek a tabulku s daty, kde je platnost valid from a valid to a pokud dotahuju takový záznam, vždycky načítám master záznam a aktuální datový záznam - tj. kolekci s jedním prvkem (aktuální data). Pokud bych měl např. třídu Person s historií, tak mám tabulku Person (kde je jen id,případně create time a autor ) a PersonDatas, kde je datová část s historií, takže když chci načíst třídu Person, použiju criteria=DetachedCriteria.for(Person.class); criteria.createAlias(personDatas,personData,Criteria.LEFT_JOIN); criteria.add(Restrictions.isNull(personData.vt)); Pokud použiju takhle postavený dotaz, dostanu všechny osoby s jedním aktuálním datovým záznamem v kolekci (používám generování z databáze, navíc generuji předky, potomky vytvářím, přidávám metodu vracející onen jediný záznam a nepracuji potom s kolekcí, ale s jedním datovým aktuálním záznamem ). S ukládáním není problém, protože nepoužívám (záměrně) kaskádní operace - většinou pracuji s číselníky a vytvoření záznamu v číselníku při ukládání dat by bylo nežádoucí (nechci při uložení Person vytvořit Permission, pokud ještě neexistuje, mazání se nepoužívá nikde-taktéž nežádoucí). Díky za reakci. -- Původní zpráva -- Od: Petr Janata petrjan...@gmail.com Datum: 29. 4. 2013 Předmět: Re: hibernate-critera s withClause Tady myslím se vyjádřil Gavin King přesně: It cannot be done and it should not be done and you are trying to do a Bad Thing. ORM transparentní není a nebude. See inline 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. Co by se mělo dít, když na entitě znovu zavoláš EntityManager.merge() nebo persist()? Mají se ty nedotažené permissions smazat? SQL dotaz vrací přesně to, co potřebuju, jen není kolekce načtená. Jak sám píšeš, kolekce není načtená - LazyInitializationException 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
Re: hibernate-critera s withClause
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í