Re: Hibernate SELECT bez FROM tabuľky
Jestli vám vadí vyloženě to, že dostanete kolekci místo objektu (napr. kvuli pouzivani gener. pojo objektu v jsf, velocity sablonach apod.), tak pokud to máte tímto způsobem dělané všude, můžete generovat pojo objekty tak, že generované třídy budou dědit z třídy, kde bude metoda pro natažení prvního prvku kolekce a zároveň budete generovat předky vámi napsané třídy. Tj. Třída použitá jako předek pro generované objekty: == class Predek { protected Object getFirstObjectFromCollection(Collection col){ /** vratit prvni objekt jak potrebujete - staci jen col.iterator().next(); */ } } == generovana trida class ZaznamMasterBase { ... public Set getZaznamDatas(){ ... } } == vami napsany potomek class Zaznam { /** tohle je jediny kod, ktery musite doplnit rucne, jinak se pri zmene vse generuje beznym zpusobem **/ public ZaznamData getZaznam(){ return (ZaznamData getFirstObjectFromCollection( getZaznamDatas() ); } } Tento zpusob pak pouzivam nejak takhle: DetachedCriteria criteria = DetachedCriteria.forClass(Zaznam.class); criteria.createAlias("zaznamDatas", "zaznamData", DetachedCriteria.LEFT_ JOIN); criteria.createAlias("zaznamData.vt", "stav", DetachedCriteria.LEFT_JOIN); /** pokud chci napr. nejaky objekt, na ktery odkazujue zaznamData - napr stav */ criteria.createAlias("zaznamData.stav", "stav", DetachedCriteria.LEFT_JOIN); add(Restrictions.isNull("zaznamData.vt")); //aktualni zaznam validTo = null Pak napr.. List zaznam = (List) getHibernateTemplate().findByCriteria (criteria); v tu chvili pouzije jeden jednoduchy sql dotaz, jehoz vysledkem bude seznam z master tabulky s aktualnimi daty vcetne stavu. V iteraci se pak da volat zaznam.getZaznamData().getStav()... Takhle se da pracovat i s objekty a hbm. mapovanim generovanym z databaze (tj. bez moznosti zasahovat do hbm mapovani). Pokud se dodrzi urcita jmena konvence, da se podminka na aktualni data dat nekam do predka a pak staci jen neco jako kod nize. Vyber aktualnich zaznamu KpDatCloseDate vcetne dalsich referencovanych objektu vypada napr. takhle: ExtendedDetachedCriteria criteria = ExtendedDetachedCriteria.forClass (KpDatCloseDate.class); criteria.includeObject("perioda"); criteria.includeObject("spolecnost"); spousteny generovany sql dotaz je pak velmi jednoduchy a je jen jeden -- Původní zpráva -- Od: Rastislav Siekel Datum: 28. 6. 2013 Předmět: Re: Hibernate SELECT bez FROM tabuľky " Ahoj, > Když vytahuju aktuální data, tahám primárně z tabulky master + DetachedCriteria.LEFT_JOIN na data s podmínkou, že validTo = null (pro aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle požadovaného data (jedním sql dotazem). To je ten problém - ...dostanu master záznam + kolekce detailu... - a potom podmienka na detail nie je podmienka na posledný detail ale na kolekciu detailov... Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : (mailto:sie...@prosoft.sk) Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 28. 6. 2013 9:48, Miroslav Paulfranc wrote: "Zdravím. Pracuji s něčím velmi podobným. Mám master tabulku s detaily, přičemž detail má rozsah platnosti (2 x čas) validFrom a validTo (asi souvisí s předchozí poznámkou o normalizaci). Když vytahuju aktuální data, tahám primárně z tabulky master + DetachedCriteria.LEFT_JOIN na data s podmínkou, že validTo = null (pro aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle požadovaného data (jedním sql dotazem). Myslím, že to, co chcete přes Criteria API určitě nějak půjde. Pokud by vám nevadilo trochu upravit hbm map. soubor, tak můžete udělat to samé s podmínkou pro konec, necháte řadit podle detail_time a v mapování řeknete, že chcete v kolekci dotahovat pouze jednu položku, otázka je, jestli vám tohle omezení nebude vadit jinde (navíc je možné, že hib. bude generovat víc sql dotazů - asi min. 2, záleží i na fetch mode - select/join ). M.P. -- Původní zpráva -- Od: Rastislav Siekel (mailto:sie...@prosoft.sk) Datum: 27. 6. 2013 Předmět: Hibernate SELECT bez FROM tabuľky " Zdravím vospolok, chcel by som sa spýtať, či niekto neriešil nasledujúci problém: V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť posledný detail, čo spravím v SQL takto: ... AND detail_id = ( SELECT * FROM ( SELECT detail_id FROM detail ORDER BY detail_time DESC ) WHERE rownum = 1 ) ... Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie spraviť "SELECT FROM (...) WHERE ...". Aj DetachedCriteria, aj
Re: Hibernate SELECT bez FROM tabuľky
Aj som predpokladal, či nebolo myslené takéto niečo. Áno, fungovalo by to, ale ostatná funkcionalita by sa tomu musela prispôsobiť. Teraz sa do záznamu značí kto a kedy ho menil a ešte ide po každej zmene aj do iného systému na nejaký postprocesing - to všetko by sa muselo ošetriť. Ten VIEW bude jednoduchší... Inak vďaka všetkým za názor. Ešte nám konferencia žije - aj keď už zrejme všetci všetko vedia, keď je tak málo príspevkov :-) Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 28. 6. 2013 12:55, Lukas Barton wrote: Ulozit do master tabulky ID posledniho detailu nebo i jeho stav. Lukas 2013/6/28 Rastislav Siekel : Toto som asi presne nepochopil. Čo sa dá denormalizovať na master-detail väzbe, keď hľadám posledný detail? Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 28. 6. 2013 9:24, Lukas wrote: Denormalizujte schema a mate po problemu. Lukas Sent from Samsung Mobile Original message From: Rastislav Siekel Date: To: Java Subject: Re: Hibernate SELECT bez FROM tabuľky Vďaka za názor, ale príkaz SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút ukončenie len na poslednom detaile. Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 18:44, Petr Franta wrote: Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not exists": SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) Nebo něco podobného. Petr 2013/6/27 Rastislav Siekel Možno som to nenapísal úplne jasne - skúsim inak Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov (priebeh opravy, na poslednej je aj prípadne ukončenie). Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje podmienke). posledný detail zistím v SQL tak ako som uviedol nižšie. Rastislav "Bedo" Siekel P.S. >From detail d where d.master=:master order by d.order Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo hľadám. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 16:11, Martin Beránek wrote: Není moc jasné zadání, ale hql >From detail d where d.master=:master order by d.order Podle mě dělá co požadujete Martin Dne 27.6.2013 15:36 "Rastislav Siekel" napsal(a): Otočiť to na vyhľadávanie "detail JOIN master" by v tomto prípade nešlo. Výsledok má byť zoznam mastrov (filtrovaný na ďalšie podmienky) s tým, že sú zadané podmienky aj na posledný detail. Principiálne hľadám, či je možné v Hibernate spraviť SELECT * FROM( SELECT...) Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 15:11, ŠVARC Jiří wrote: Nevím jestli jsem dobře porozuměl, ale nešlo by to realizovat vyhledáním v seznamu detailů s kritériem odkazu na mastera, nastavením řazení a query.setMaxResults(1)? ing. Jiří Švarc Programmer Analyst Asseco Central Europe, a.s. Solutions for Demanding Business Budějovická 778/3a, 140 00 Praha 4 Czech Republic Mobile: +420 737 944 536 jiri.sv...@asseco-ce.com www.asseco-ce.com From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On Behalf Of Rastislav Siekel Sent: Thursday, June 27, 2013 2:57 PM To: Java Subject: Hibernate SELECT bez FROM tabuľky Zdravím vospolok, chcel by som sa spýtať, či niekto neriešil nasledujúci problém: V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť posledný detail, čo spravím v SQL takto: ... AND detail_id = ( SELECT * FROM ( SELECT detail_id FROM de
Re: Hibernate SELECT bez FROM tabuľky
Ahoj, > Když vytahuju aktuální data, tahám primárně z tabulky master + DetachedCriteria.LEFT_JOIN na data s podmínkou, že validTo = null (pro aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle požadovaného data (jedním sql dotazem). To je ten problém - ...dostanu master záznam + kolekce detailu... - a potom podmienka na detail nie je podmienka na posledný detail ale na kolekciu detailov... Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 28. 6. 2013 9:48, Miroslav Paulfranc wrote: Zdravím. Pracuji s něčím velmi podobným. Mám master tabulku s detaily, přičemž detail má rozsah platnosti (2 x čas) validFrom a validTo (asi souvisí s předchozí poznámkou o normalizaci). Když vytahuju aktuální data, tahám primárně z tabulky master + DetachedCriteria.LEFT_JOIN na data s podmínkou, že validTo = null (pro aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle požadovaného data (jedním sql dotazem). Myslím, že to, co chcete přes Criteria API určitě nějak půjde. Pokud by vám nevadilo trochu upravit hbm map. soubor, tak můžete udělat to samé s podmínkou pro konec, necháte řadit podle detail_time a v mapování řeknete, že chcete v kolekci dotahovat pouze jednu položku, otázka je, jestli vám tohle omezení nebude vadit jinde (navíc je možné, že hib. bude generovat víc sql dotazů - asi min. 2, záleží i na fetch mode - select/join ). M.P. -- Původní zpráva -- Od: Rastislav Siekel Datum: 27. 6. 2013 Předmět: Hibernate SELECT bez FROM tabuľky Zdravím vospolok, chcel by som sa spýtať, či niekto neriešil nasledujúci problém: V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť posledný detail, čo spravím v SQL takto: ... AND detail_id = ( SELECT * FROM ( SELECT detail_id FROM detail ORDER BY detail_time DESC ) WHERE rownum = 1 ) ... Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie spraviť "SELECT FROM (...) WHERE ...". Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou pripravia SQL príkaz. Je nejaká možnosť ako toto obísť? Vďaka, Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20
Re: Hibernate SELECT bez FROM tabuľky
Áno, tak som to nakoniec spravil - SQL VIEW cez SELECT master JOIN detail ... WHERE detail_id IN (SELECT MAX(detail_id) KEEP (DENSE_RANK LIST ORDER BY time)... Pre hibernate to namapujem ako 1:1 a všetky podmienky na master aj detail tak budú úplne jednoduché. Súhlasím, že treba nechať na Hibernate len to jednoduché. Vždy to bude len podmnožina SQL možností... Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 28. 6. 2013 9:25, Petr Franta wrote: Pak to asi stačí spojit s tím co posílal kolega předemnou, asi nějak takto: SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec AND detail.detail_id in (select min(detail_id) keep (dense_rank first order by detail_time desc) from detail WHERE detail.master_id = master.id)) , nebo s tím vaším sub-selectem. Je to asi spíš o SQL (HQL). Snad napoví: http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#querycriteria-detachedqueries nebo v HQL http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#queryhql-subqueries Petr 2013/6/28 Rastislav SiekelVďaka za názor, ale príkaz SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút ukončenie len na poslednom detaile. Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 18:44, Petr Franta wrote: Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not exists": SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) Nebo něco podobného. Petr 2013/6/27 Rastislav Siekel Možno som to nenapísal úplne jasne - skúsim inak Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov (priebeh opravy, na poslednej je aj prípadne ukončenie). Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje podmienke). posledný detail zistím v SQL tak ako som uviedol nižšie. Rastislav "Bedo" Siekel P.S. >From detail d where d.master=:master order by d.order Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo hľadám.
Re: Hibernate SELECT bez FROM tabuľky
Ulozit do master tabulky ID posledniho detailu nebo i jeho stav. Lukas 2013/6/28 Rastislav Siekel : > Toto som asi presne nepochopil. Čo sa dá denormalizovať na master-detail > väzbe, keď hľadám posledný detail? > > > Rastislav "Bedo" Siekel > > > > Ing. Rastislav Siekel > Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia > E-mail : > Tel : 041/562 54 91 > Fax : 041/562 54 97 > Mobil : 0905 34 00 20 > > > > On 28. 6. 2013 9:24, Lukas wrote: > > Denormalizujte schema a mate po problemu. > > Lukas > > > Sent from Samsung Mobile > > > > Original message > From: Rastislav Siekel > Date: > To: Java > Subject: Re: Hibernate SELECT bez FROM tabuľky > > > Vďaka za názor, ale príkaz > > SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE > detail.master_id = master.id AND detail.sloupce <> konec) > > vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, > ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút > ukončenie len na poslednom detaile. > > Rastislav "Bedo" Siekel > > > > > Ing. Rastislav Siekel > Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia > E-mail : > Tel : 041/562 54 91 > Fax : 041/562 54 97 > Mobil : 0905 34 00 20 > > > > On 27. 6. 2013 18:44, Petr Franta wrote: > > Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not > exists": > > SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE > detail.master_id = master.id AND detail.sloupce <> konec) > > Nebo něco podobného. > > Petr > > 2013/6/27 Rastislav Siekel >> >> Možno som to nenapísal úplne jasne - skúsim inak >> >> Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov >> (priebeh opravy, na poslednej je aj prípadne ukončenie). >> Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s >> podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho >> určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo >> ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje >> podmienke). >> >> posledný detail zistím v SQL tak ako som uviedol nižšie. >> >> Rastislav "Bedo" Siekel >> >> >> P.S. >> >> >> >From detail d where d.master=:master order by d.order >> Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo >> hľadám. >> >> >> >> >> Ing. Rastislav Siekel >> Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia >> E-mail : >> Tel : 041/562 54 91 >> Fax : 041/562 54 97 >> Mobil : 0905 34 00 20 >> >> >> >> On 27. 6. 2013 16:11, Martin Beránek wrote: >> >> Není moc jasné zadání, ale hql >> >> From detail d where d.master=:master order by d.order >> >> Podle mě dělá co požadujete >> >> Martin >> >> Dne 27.6.2013 15:36 "Rastislav Siekel" napsal(a): >>> >>> Otočiť to na vyhľadávanie "detail JOIN master" by v tomto prípade nešlo. >>> Výsledok má byť zoznam mastrov (filtrovaný na ďalšie podmienky) s tým, že sú >>> zadané podmienky aj na posledný detail. >>> >>> Principiálne hľadám, či je možné v Hibernate spraviť SELECT * FROM( >>> SELECT...) >>> >>> >>> Rastislav "Bedo" Siekel >>> >>> >>> >>> Ing. Rastislav Siekel >>> Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia >>> E-mail : >>> Tel : 041/562 54 91 >>> Fax : 041/562 54 97 >>> Mobil : 0905 34 00 20 >>> >>> >>> >>> On 27. 6. 2013 15:11, ŠVARC Jiří wrote: >>> >>> Nevím jestli jsem dobře porozuměl, ale nešlo by to realizovat vyhledáním >>> v seznamu detailů s kritériem odkazu na mastera, nastavením řazení a >>> query.setMaxResults(1)? >>> >>> >>> >>> ing. Jiří Švarc >>> Programmer Analyst >>> >>> >>> >>> Asseco Central Europe, a.s. >>> Solutions for Demanding Business >>> >>> Budějovická 778/3a, 140 00 Praha 4 >>> Czech Republic >>> Mobile: +420 737 944 536 >>> jiri.sv...@asseco-ce.com >>> www.asseco-ce.com >>> >>> >>> >>> From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On >>> Behalf Of Rastislav Siekel >>> Sent: Thursday, June 27, 2013 2:57 PM >>> To: Java >>> Subject: Hibernate SELECT bez FROM tabuľky >>> >>> >>> >>> Zdravím vospolok, >>> >>> chcel by som sa spýtať, či niekto neriešil nasledujúci problém: >>> >>> V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť >>> posledný detail, čo spravím v SQL takto: >>> >>> ... AND detail_id = >>> ( >>> SELECT * FROM >>> ( >>> SELECT detail_id >>> FROM detail >>> ORDER BY detail_time DESC >>> ) >>> WHERE rownum = 1 >>> ) >>> ... >>> >>> >>> Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie >>> spraviť "SELECT FROM (...) WHERE ...". >>> Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou >>> pripravia SQL príkaz. Je nejaká možnosť ako toto obísť? >>> >>> Vďaka, >>> Rastislav "Bedo" Siekel >>> >>> >>> >>> >>> >>> Ing. Rastislav Siekel >>> Prosoft s.r.o., Kuzmányho 8, 010 01 Žili
Re: Hibernate SELECT bez FROM tabuľky
Toto som asi presne nepochopil. Čo sa dá denormalizovať na master-detail väzbe, keď hľadám posledný detail? Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 28. 6. 2013 9:24, Lukas wrote: Denormalizujte schema a mate po problemu. Lukas Sent from Samsung Mobile Original message From: Rastislav Siekel Date: To: Java Subject: Re: Hibernate SELECT bez FROM tabuľky Vďaka za názor, ale príkaz SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút ukončenie len na poslednom detaile. Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 18:44, Petr Franta wrote: Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not exists": SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) Nebo něco podobného. Petr 2013/6/27 Rastislav SiekelMožno som to nenapísal úplne jasne - skúsim inak Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov (priebeh opravy, na poslednej je aj prípadne ukončenie). Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje podmienke). posledný detail zistím v SQL tak ako som uviedol nižšie. Rastislav "Bedo" Siekel P.S. >From detail d where d.master=:master order by d.order Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo hľadám. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 16:11, Martin Beránek wrote: Není moc jasné zadání, ale hql From detail d where d.master=:master order by d.order Podle mě dělá co požadujete Martin Dne 27.6.2013 15:36 "Rastislav Siekel" napsal(a): Otočiť to na vyhľadávanie "detail JOIN master" by v tomto prípade nešlo. Výsledok má byť zoznam mastrov (filtrovaný na ďalšie podmienky) s tým, že sú zadané podmienky aj na posledný detail. Principiálne hľadám, či je možné v Hibernate spraviť SELECT * FROM( SELECT...) Rastislav "Bedo" Siekel
Re: Hibernate SELECT bez FROM tabuľky
Zdravím. Pracuji s něčím velmi podobným. Mám master tabulku s detaily, přičemž detail má rozsah platnosti (2 x čas) validFrom a validTo (asi souvisí s předchozí poznámkou o normalizaci). Když vytahuju aktuální data, tahám primárně z tabulky master + DetachedCriteria.LEFT_JOIN na data s podmínkou, že validTo = null (pro aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle požadovaného data (jedním sql dotazem). Myslím, že to, co chcete přes Criteria API určitě nějak půjde. Pokud by vám nevadilo trochu upravit hbm map. soubor, tak můžete udělat to samé s podmínkou pro konec, necháte řadit podle detail_time a v mapování řeknete, že chcete v kolekci dotahovat pouze jednu položku, otázka je, jestli vám tohle omezení nebude vadit jinde (navíc je možné, že hib. bude generovat víc sql dotazů - asi min. 2, záleží i na fetch mode - select/join ). M.P. -- Původní zpráva -- Od: Rastislav Siekel Datum: 27. 6. 2013 Předmět: Hibernate SELECT bez FROM tabuľky " Zdravím vospolok, chcel by som sa spýtať, či niekto neriešil nasledujúci problém: V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť posledný detail, čo spravím v SQL takto: ... AND detail_id = ( SELECT * FROM ( SELECT detail_id FROM detail ORDER BY detail_time DESC ) WHERE rownum = 1 ) ... Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie spraviť "SELECT FROM (...) WHERE ...". Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou pripravia SQL príkaz. Je nejaká možnosť ako toto obísť? Vďaka, Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : (mailto:sie...@prosoft.sk) Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 "
Re: Hibernate SELECT bez FROM tabuľky
*Pak to asi stačí spojit s tím co posílal kolega předemnou, asi nějak takto: SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = **master.id** AND detail.sloupce <> konec **AND **detail.detail_id in (**select min(detail_id) keep (dense_rank first order by detail_time desc) from detail WHERE **detail.master_id = master.id)) **, nebo s tím vaším sub-selectem. Je to asi spíš o SQL (HQL). Snad napoví: http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#querycriteria-detachedqueries nebo v HQL http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#queryhql-subqueries *Petr 2013/6/28 Rastislav Siekel > Vďaka za názor, ale príkaz > > > *SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE > detail.master_id = **master.id** AND detail.sloupce <> konec)* > > vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, > ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút > ukončenie len na poslednom detaile. > > > Rastislav "Bedo" Siekel > > > > -- > Ing. Rastislav Siekel > Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia > E-mail : > Tel : 041/562 54 91 > Fax : 041/562 54 97 > Mobil : 0905 34 00 20 > > > > On 27. 6. 2013 18:44, Petr Franta wrote: > > Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not > exists": > > SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE > detail.master_id = master.id AND detail.sloupce <> konec) > > Nebo něco podobného. > > Petr > > 2013/6/27 Rastislav Siekel > >> Možno som to nenapísal úplne jasne - skúsim inak >> >> Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov >> (priebeh opravy, na poslednej je aj prípadne ukončenie). >> Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s >> podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho >> určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo >> ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje >> podmienke). >> >> posledný detail zistím v SQL tak ako som uviedol nižšie. >> >> Rastislav "Bedo" Siekel >> >> >> P.S. >> >> >> *>From detail d where d.master=:master order by d.order* >> Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo >> hľadám. >> >> >> >> -- >> Ing. Rastislav Siekel >> Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia >> E-mail : >> Tel : 041/562 54 91 >> Fax : 041/562 54 97 >> Mobil : 0905 34 00 20 >> >> >> >>On 27. 6. 2013 16:11, Martin Beránek wrote: >> >> Není moc jasné zadání, ale hql >> >> From detail d where d.master=:master order by d.order >> >> Podle mě dělá co požadujete >> >> Martin >> Dne 27.6.2013 15:36 "Rastislav Siekel" napsal(a): >> >>> Otočiť to na vyhľadávanie "detail JOIN master" by v tomto prípade >>> nešlo. Výsledok má byť zoznam mastrov (filtrovaný na ďalšie podmienky) s >>> tým, že sú zadané podmienky aj na posledný detail. >>> >>> Principiálne hľadám, či je možné v Hibernate spraviť SELECT * FROM( >>> SELECT...) >>> >>> >>> Rastislav "Bedo" Siekel >>> >>> >>> -- >>> Ing. Rastislav Siekel >>> Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia >>> E-mail : >>> Tel : 041/562 54 91 >>> Fax : 041/562 54 97 >>> Mobil : 0905 34 00 20 >>> >>> >>> >>> On 27. 6. 2013 15:11, ŠVARC Jiří wrote: >>> >>> Nevím jestli jsem dobře porozuměl, ale nešlo by to realizovat >>> vyhledáním v seznamu detailů s kritériem odkazu na mastera, nastavením >>> řazení a query.setMaxResults(1)? >>> >>> >>> >>> *ing. Jiří Švarc** >>> *Programmer Analyst >>> >>> >>> >>> *Asseco Central Europe, a.s.** >>> *Solutions for Demanding Business >>> >>> Budějovická 778/3a, 140 00 Praha 4 >>> Czech Republic >>> Mobile: +420 737 944 536 >>> jiri.sv...@asseco-ce.com >>> www.asseco-ce.com >>> >>> >>> >>> *From:* konference-boun...@java.cz >>> [mailto:konference-boun...@java.cz] >>> *On Behalf Of *Rastislav Siekel >>> *Sent:* Thursday, June 27, 2013 2:57 PM >>> *To:* Java >>> *Subject:* Hibernate SELECT bez FROM tabuľky >>> >>> >>> >>> Zdravím vospolok, >>> >>> chcel by som sa spýtať, či niekto neriešil nasledujúci problém: >>> >>> V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť >>> *posledný >>> *detail, čo spravím v SQL takto: >>> >>> ... AND detail_id = >>> ( >>> SELECT * FROM >>> ( >>> SELECT detail_id >>> FROM detail >>> ORDER BY detail_time DESC >>> ) >>> WHERE rownum = 1 >>> ) >>> ... >>> >>> >>> Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie >>> spraviť "SELECT FROM (...) WHERE ...". >>> Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou >>> pripravia SQL príkaz. Je nejaká možnosť ako toto obísť? >>> >>> Vďaka, >>> Rastislav "Bedo" Siekel >>> >>> >>> -- >>> >>> Ing. Rastislav Siekel >>> Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia >>
Re: Hibernate SELECT bez FROM tabuľky
Denormalizujte schema a mate po problemu. Lukas Sent from Samsung Mobile Original message From: Rastislav Siekel Date: To: Java Subject: Re: Hibernate SELECT bez FROM tabuľky Vďaka za názor, ale príkaz SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút ukončenie len na poslednom detaile. Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 18:44, Petr Franta wrote: Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not exists": SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) Nebo něco podobného. Petr 2013/6/27 Rastislav Siekel Možno som to nenapísal úplne jasne - skúsim inak Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov (priebeh opravy, na poslednej je aj prípadne ukončenie). Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje podmienke). posledný detail zistím v SQL tak ako som uviedol nižšie. Rastislav "Bedo" Siekel P.S. >From detail d where d.master=:master order by d.order Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo hľadám. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 16:11, Martin Beránek wrote: Není moc jasné zadání, ale hql From detail d where d.master=:master order by d.order Podle mě dělá co požadujete Martin Dne 27.6.2013 15:36 "Rastislav Siekel" napsal(a): Otočiť to na vyhľadávanie "detail JOIN master" by v tomto prípade nešlo. Výsledok má byť zoznam mastrov (filtrovaný na ďalšie podmienky) s tým, že sú zadané podmienky aj na posledný detail. Principiálne hľadám, či je možné v Hibernate spraviť SELECT * FROM( SELECT...) Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 15:11, ŠVARC Jiří wrote: Nevím jestli jsem dobře porozuměl, ale nešlo by to realizovat vyhledáním v seznamu detailů s kritériem odkazu na mastera, nastavením řazení a query.setMaxResults(1)? ing. Jiří Švarc Programmer Analyst Asseco Central Europe, a.s. Solutions for Demanding Business Budějovická 778/3a, 140 00 Praha 4 Czech Republic Mobile: +420 737 944 536 jiri.sv...@asseco-ce.com www.asseco-ce.com From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On Behalf Of Rastislav Siekel Sent: Thursday, June 27, 2013 2:57 PM To: Java Subject: Hibernate SELECT bez FROM tabuľky Zdravím vospolok, chcel by som sa spýtať, či niekto neriešil nasledujúci problém: V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť posledný detail, čo spravím v SQL takto: ... AND detail_id = ( SELECT * FROM ( SELECT detail_id FROM detail ORDER BY detail_time DESC ) WHERE rownum = 1 ) ... Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie spraviť "SELECT FROM (...) WHERE ...". Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou pripravia SQL príkaz. Je nejaká možnosť ako toto obísť? Vďaka, Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20
Re: Hibernate SELECT bez FROM tabuľky
Ahoj, Každopádně myslím, že otázkou "jak udělám v Criteria API select z poddotazu" už řešitele zbytečně svazujete. Někdy je lepší se netrápit hlavolamem, jak nacpat nějaký nestandardní dotaz do Criteria API nebo HQL, když tu je x způsobů, jak to udělat v SQL a jsou snad i Svätá pravda. Už viac krát som to vyriešil nejakým zložitejším VIEW priamo v DB a pre Hibernate ostali len primitívne príkazy. Aj teraz to zrejme tak dopadne. Ale zaujímalo ma principiálne, či je Hibernate možné použiť, keď vo FROM nie je tabuľka, ale subselect. Ale zrejme nie. Vďaka, Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 21:56, Tomáš Záluský wrote: Dobrý den, mně to přijde spíš jako problém pro analytické funkce. Něco jako: select min(detail_id) keep (dense_rank first order by detail_time desc) from detail Ano, syntaxe je pro ANSI sqlistu hrozná, ale je to silný nástroj. Každopádně myslím, že otázkou "jak udělám v Criteria API select z poddotazu" už řešitele zbytečně svazujete. Někdy je lepší se netrápit hlavolamem, jak nacpat nějaký nestandardní dotaz do Criteria API nebo HQL, když tu je x způsobů, jak to udělat v SQL a jsou snad i čitelnější, typicky např. session.createSQLQuery("select {m.*} from master {m} ...").addEntity("m",Master.class).list() A i kdybyste chtěl zůstat u Criteria API, pořád by nestačilo Restrictions.sqlRestriction (viz rada mého předchůdce s exists)? Tomáš Záluský __ Od: "Rastislav Siekel" Komu: Java Datum: 27.06.2013 15:03 Předmět: Hibernate SELECT bez FROM tabuľky Zdravím vospolok, chcel by som sa spýtať, či niekto neriešil nasledujúci problém: V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť posledný detail, čo spravím v SQL takto: ... AND detail_id = ( SELECT * FROM ( SELECT detail_id >FROM detail ORDER BY detail_time DESC ) WHERE rownum = 1 ) ... Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie spraviť "SELECT FROM (...) WHERE ...". Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou pripravia SQL príkaz. Je nejaká možnosť ako toto obísť? Vďaka, Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20
Re: Hibernate SELECT bez FROM tabuľky
Vďaka za názor, ale príkaz SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) vyberie všetky záznamy Master, pretože ku každému existuje nejaký detail, ktorý hovorí, že oprava nie je ukončená - prvý detail. Mňa zaujíma atribút ukončenie len na poslednom detaile. Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 18:44, Petr Franta wrote: Myslím si, že by to mělo jít vyřešit pomocí podmínky "exists" nebo "not exists": SELECT xyz FROM master WHERE exists (SELECT 1 FROM detail WHERE detail.master_id = master.id AND detail.sloupce <> konec) Nebo něco podobného. Petr 2013/6/27 Rastislav SiekelMožno som to nenapísal úplne jasne - skúsim inak Mám záznamy o oprave - hlavičky, a ku každej môže byť 1 - N detailov (priebeh opravy, na poslednej je aj prípadne ukončenie). Vytváram SELECT pre zoznam opráv, ktoré ešte nemajú koniec, t.j. s podmienkou, či posledný detail ešte nemá zadaný koniec (tie predošlé ho určite nemajú zadaný, takže obyčajný JOIN by mi vybral všetky opravy, lebo ku každému master existuje určite aspoň jeden detail, ktorý vyhovuje podmienke). posledný detail zistím v SQL tak ako som uviedol nižšie. Rastislav "Bedo" Siekel P.S. >From detail d where d.master=:master order by d.order Tento príkaz vypíše pre 1 master všetky detaily, čo určite nie je to, čo hľadám. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 16:11, Martin Beránek wrote: Není moc jasné zadání, ale hql From detail d where d.master=:master order by d.order Podle mě dělá co požadujete Martin Dne 27.6.2013 15:36 "Rastislav Siekel" napsal(a): Otočiť to na vyhľadávanie "detail JOIN master" by v tomto prípade nešlo. Výsledok má byť zoznam mastrov (filtrovaný na ďalšie podmienky) s tým, že sú zadané podmienky aj na posledný detail. Principiálne hľadám, či je možné v Hibernate spraviť SELECT * FROM( SELECT...) Rastislav "Bedo" Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 27. 6. 2013 15:11, ŠVARC Jiří wrote: Nevím jestli jsem dobře porozuměl, ale nešlo by to realizovat vyhledáním v seznamu detailů s kritériem odkazu na mastera, nastavením řazení a query.setMaxResults(1)?