Re: Hibernate SELECT bez FROM tabuľky

Miroslav Paulfranc paulfrm na seznam.cz
Pátek Červen 28 13:47:03 CEST 2013


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<ZaznamData> 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> zaznam = (List<Zaznam>) 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 <siekel na prosoft.sk>
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 : <siekel na prosoft.sk> (mailto:siekel na 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 <siekel na prosoft.sk>(mailto:siekel na 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 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 : <siekel na prosoft.sk> (mailto:siekel na prosoft.sk) 
Tel : 041/562 54 91 
Fax : 041/562 54 97 
Mobil : 0905 34 00 20 





" " 

"
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://amaio.cz/pipermail/konference/attachments/20130628/cecf4b6c/attachment.html>


Další informace o konferenci Konference