hibernate-critera s withClause

2013-04-29 Tema obsahu Miroslav Paulfranc
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

2013-04-29 Tema obsahu Petr Janata
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

2013-04-29 Tema obsahu Miroslav Paulfranc
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

2013-04-29 Tema obsahu Ondra Medek
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

2013-04-29 Tema obsahu Petr Janata
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

2013-04-29 Tema obsahu Miroslav Paulfranc
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
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html#createCriteria

Re: hibernate-critera s withClause

2013-04-29 Tema obsahu Miroslav Paulfranc
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í