Sunteți pe pagina 1din 6

Metode de acces la date n aplicatii JPA

In principiu exist mai multe interfete utilizator API pentru interogarea si modificarea datelor
dintr-o aplicatie Web:
- JD! API" care nseamn utilizarea limba#ului $%& n Ja'a(
- Metoda din clasa )*ntit+Manager, -find" remo'e" s.a./ pentru operatii cu o entitate(
- JP%& -Ja'a Persistence %uer+ &anguage/" asemntor cu $%& dar care lucreaz cu notiuni
din sc0ema abstract -entitti" colectii utilizate pentru asocieri multiple" s.a./
- !riteria API" un limba# specializat -D$&1Domain $pecific &anguage/.
Atunci c2nd exist asocieri multiple ntre entitti este preferabil utilizarea JPA" adic fie
JP%&" fie !riteria API.
JP%& este mai simplu de folosit" mai ales pentru cei care cunosc limba#ul $%&( limba#ul
criteriilor este ce'a mai dificil de utilizat si nu seamn cu alte limba#e anterioare.
!ererile JP%& sunt interpretate" iar limba#ul criteriilor este compilat( de aici rezult a'anta#e
pentru criterii" ca timp de executie si ca 'erificri suplimentare la compilare.
*xemplele urmtoare ilustreaz utilizarea direct a metodelor )*ntit+Manager, pentru diferite
operatii cu entitti JPA -extrase din aplicatia )roster,/:
pri'ate *ntit+Manager em(
3
44 gasirea unui #ucator cu )id, cunoscut
Pla+er pla+er 1 em.find-Pla+er.class" pla+erId/(
3
44 toti #ucatorii dintr-o ec0ipa
5eam team 1 em.find-5eam.class" teamId/(
&ist6Pla+er7 pla+er&ist 1 -&ist6Pla+er7/ team.getPla+ers-/(
3
44 adaugarea unui nou #ucator la o ec0ip
Pla+er pla+er 1 em.find-Pla+er.class" pla+erId/(
5eam team 1 em.find-5eam.class" teamId/(
team.addPla+er-pla+er/(
pla+er.add5eam-team/(
...
44 eliminarea unui #ucator dintr-o ec0ipa
Pla+er pla+er 1 em.find-Pla+er.class" pla+erId/(
!ollection65eam7 teams 1 pla+er.get5eams-/(
Iterator65eam7 i 1 teams.iterator-/(
80ile -i.0as9ext-// :
5eam team 1 i.next-/(
team.dropPla+er-pla+er/(
;
em.remo'e-pla+er/(
&imba#ul de interogare JP%&
<peratiile necesare pentru o interogare JP%& sunt:
- $e creeaz un obiect cerere folosind un obiect *ntit+Manager(
- $e stabilesc parametrii 'ariabili ai cererii si alte configurri(
- $e execut cererea si se produce o list Ja'a ca rezultat(
- $e prelucreaz rezultatul cererii -o list/.
<biectele cerere" de tip )%uer+," pot fi create n dou moduri:
- dinamic" prin metoda )create%uer+," care si execut cererea.
- static prin adnotarea =9amed%uer+ si metoda )create9amed%uer+,.
Parametrii cererii se stabilesc prin metoda )setParameter,.
1
!ererea este transmis spre executie cu metoda )get>esult,.
!ererile pot contine parametri cu nume" precedati de ?:@ sau parametri pozitionali de forma ?A
n@ unde n este numrul -pozitia/ parametrului.
*xemplu de creare dinamic a unei cereri cu un parametru pozitional si executie cerere:
44 toti #ucatorii din ec0ipa cu numele )team,
$tring Buer+ 1 Cselect t from 5eam t 80ere teamId 1 ADC(
%uer+ B 1 em.create%uer+-Buer+/(
B.setParameter-D" team/(
&ist6Pla+er7 pla+ers 1 B.get>esult&ist-/(
Earianta urmtoare este o cerere a'2nd un parametru cu nume -numele este )team,/ si
foloseste o nlntuire de metode din clasa )%uer+,:
&ist6Pla+er7 pla+ers 1 em.create%uer+
-Cselect t from 5eam t 80ere teamId 1 :teamC/
.setParameter-)team," teamId/
.get>esult&ist-/(
Aceeasi problem dar cu obiect cerere creat static:
=9amed%uer+-
name1CfindPla+ersIn5eamC"
Buer+1Cselect t from 5eam t 80ere teamId 1 :teamC
/
orders 1 em.create9amed%uer+ -CfindPla+ersIn5eamC/
.setParameter-)team," teamId/
.get>esult&ist-/(
Mai multe cereri cu nume pot fi asociate unei clase entitate astfel:
=*ntit+
=5able-name 1 C*JF><$5*>FP&AG*>C/
=9amed%ueries-:
=9amed%uer+-name 1 Croster.entit+.Pla+er.findAllPla+ersC"Buer+ 1 C$*&*!5 p H><M Pla+er pC/"
=9amed%uer+-name 1 Croster.entit+.Pla+er.findPla+ers+!it+C" Buer+ 1 C$*&*!5 DI$5I9!5 p C
I CH><M Pla+er p" C I CI9 -p.teams/ t C I CWJ*>* t.cit+ 1 :cit+C/"
=9amed%uer+-name 1 Croster.entit+.Pla+er.findPla+ers+&eagueC" Buer+ 1 C$*&*!5 DI$5I9!5 p C
I CH><M Pla+er p" C I CI9 -p.teams/ t C I CWJ*>* t.league 1 :leagueC/
;/
public class Pla+er implements #a'a.io.$erializable :
pri'ate !ollection65eam7 teams(
pri'ate $tring id(
pri'ate $tring name(
pri'ate $tring position(
3
;
*xemple de utilizare n aplicatia )roster,:
public &ist6Pla+er7 getPla+ers+&eagueId-$tring leagueId/ t0ro8s *xception :
&eague league 1 em.find-&eague.class" leagueId/(
return -&ist6Pla+er7/ em.create9amed%uer+-
Croster.entit+.Pla+er.findPla+ers+&eagueC/
.setParameter-CleagueC" league/
.get>esult&ist-/(
2
;
*lemente de sintax a limba#ului JP%&
Kramatica limba#ului JP%& este destul de complex. !u'intele c0eie si 'ariabilele de
identificare pot fi scrise cu litere mari sau mici sau cu orice combinatii de litere mari si mici.
Horma general a unei cereri JP%& )select, este:
$*&*!5 LeM H><M 3e LWJ*>* ..M LK><NP G ..M LJAEI9K ..M L<>D*> ..M
Eariabila ?e@ este numit 'ariabil de identificare si determin domeniul interogrii si deci tipul
rezultatului interogrii. *a este definit n clauza H><M " este folosit n clauza $*&*!5 si
e'entual n clauza WJ*>*.
Eariabila ?e@ poate reprezenta o entitate sau un element dintr-o asociere D:D"D:9" 9:D.
!lauzele )group b+," )0a'ing, si )order, au aceeasi semnificatie si utilizare din $%&: grupeaz
elementele listei de rezultate" restr2nge lista de rezultate dup alte conditii sau ordoneaz lista
de rezultate.
*xemple de interogri ec0i'alente care se refer la o singur entitate:
44 lista tuturor #ucatorilor -toate instantele entittii Pla+er/
$*&*!5 p H><M Pla+er p
$*&*!5 H><M Pla+er A$ p
*xemple de selectare a unui #uctor dup anumite proprietti ale sale
44 #uctor-#ucatori/ cu nume dat si4sau cu o pozitie n ec0ip dat
$*&*!5 p H><M Pla+er p WJ*>* p.name1:name
$*&*!5 p H><M Pla+er p WJ*>* p.position1AD
$*&*!5 DI$5I9!5 p H><M Pla+er p WJ*>* p.position1:position A9D p.name1:name
!ererile care )na'ig0eaz, prin asocierile dintre entitti pot folosi fie cu'2ntul I9" fie cu'2ntul
J<I9" ec0i'alente ca efect. *xemple:
44 toti #uctorii unei ec0ipe cu nume dat
$*&*!5 p H><M Pla+er p"I9 -p.teams/ t WJ*>* t1 :team
$*&*!5 p H><M Pla+er p J<I9 p.teams t WJ*>* t1 :team
$*&*!5 p H><M Pla+er p WJ*>* p.team 1 :team
Eariabila ?p@ reprezint entitatea )Pla+er, iar 'ariabila ?t@ reprezint entitatea asociat )5eam,.
<peratorul punct este operator de na'igare" iar expresia )p.teams, trece de la o entitate Pla+er
la una sau mai multe entitti 5eam asociate. Eariabila )team, este de tip )$tring,.
*xemplul urmtor este o cerere care tra'erseaz mai multe asocieri:
44 toti #uctorii care #oac ntr-o lig dat -)league,/
$*&*!5 DI$5I9!5 p H><M Pla+er p"I9-p.teams/ t WJ*>* t.league1:league
*xpresia )p.teams, tra'erseaz relatia #uctor-ec0ip iar expresia )t.league, tra'erseaz
relatia ec0ip-lig -'ariabila )league, este de tip )&eague,/.
De obser'at c un punct este folosit si pentru a selecta proprietatea unei entitti -fie un c2mp
persistent" fie un c2mp de asociere cu alte entitti/:
44 #uctorii care apartin unei ec0ipe dintr-un oras dat
$*&*!5 p H><M Pla+er p"I9-p.teams/ A$ t WJ*>* t.cit+1:cit+ 44 $tring cit+
Intr-o aceeasi expresie poate apare un punct ca operator de na'igare si un punct care
selecteaz o proprietate. *xemplu:
3
44 #ucatorii care practic un anumit sport
$*&*!5 p H><M Pla+er p"I9-p.teams/ t WJ*>* t.league.sport1:sport
*xemple de cereri care folosesc si alte conditii n clauza WJ*>*:
$*&*!5 p H><M Pla+er p WJ*>* p.name &IO* @Mic0P@
$*&*!5 t H><M 5eam t WJ*>* t.league I$ 9N&&
$*&*!5 p H><M Pla+er p WJ*>* p.teams I$ *MP5G
$*&*!5 p H><M Pla+er p WJ*>* p.salar+ *5W**9 :lo8er$alar+ A9D :0ig0er$alar+
$*&*!5 p H><M Pla+er p WJ*>* p.salar+71:lo8er$alar+ A9D p.salar+61:0ig0er$alar+
$*&*!5 pD H><M Pla+er pD"Pla+er pQ WJ*>* pD.salar+7pQ.salar+ A9D pQ.name1:name
In ultimul exemplu sunt necesare dou 'ariabile de identificare pD si pQ -de acelasi tip/
pentru a putea exprima comparatia( se cer #uctorii care au un salariu mai mare dec2t un
#uctor cu nume dat -)name,/.
<peratia )select, produce o list de obiecte rezultate n general dintr-o na'igare pe asocieri
iar orice na'igare are un punct de pornire -)root,/. Domeniul cererii poate fi doar entitatea punct
de pornire" care poate fi precedat optional de cu'2ntul c0eie )A$,. *xemplu:
$*&*!5 t H><M 5*AM t 44 toate ec0ipele
$*&*!5 t H><M 5*AM A$ t
Declararea unei alte 'ariabile n clauza H><M afecteaz rezultatul cererii c0iar dac a doua
'ariabil nu este folosit ntr-o conditie WJ*>*. *xemplu:
$*&*!5p H><M Pla+er p"I9-p.teams/ A$ t 44 toti #uctorii unei ec0ipe
$*&*!5 p H><M Pla+er p WJ*>* p.teams I$ 9<5 *MP5G 44 toti #ucatorii unei ec0ipe
<biectele )%uer+, din JP%& pot contine comenzile )select," )update, si )delete,. *xemple:
NPDA5* Pla+er p $*5 p.status1 @inacti'e@ WJ*>* p.lastPla+ed6 :aDate
D*&*5* H><M Pla+er p WJ*>* p.status1 @inacti'e@ A9D p.teams I$ *MP5G
Interogri cu criterii
!riteria API este o alt form de exprimare a acelorasi operatii din cererile JP%&" folosind
metode din clasa )!riteria%uer+, pentru a construi treptat ec0i'alentul unei cereri JP%&:
- metoda )from, stabileste entitatea cu care porneste na'igarea prin asocieri(
- metoda )select, stabileste tipul rezultatului cererii -o clas generic/(
- metoda )80ere, stabileste conditiile includerii unor obiecte n rezultate(
- metoda )#oin, creeaz un tabel 'irtual cu dou entitti reunite(
- metoda )order+, poate ordona lista de rezultate(
- metoda )group+, poate grupa rezultatele dup anumite criterii(
- metoda )0a'ing, stabileste o filtrare suplimentar pe grupuri(
- metoda )distinct, -cu parametrul )true,/ retine n rezultat numai obiectele distincte.
*tapele necesare pentru utilizarea interogrilor cu criterii sunt:
- !rearea unui obiect )!riteriauilder, folosind obiectul *ntit+Manager(
- !rearea unui obiect cerere )!riteria%uer+, folosind obiectul *ntit+Manager(
- $tabilirea punctului de pornire al interogrii folosind metoda )from, din )!riteria%uer+,(
- $tabilirea tipului rezultatului cererii folosind metoda )select, din )!riteria%uer+,(
- !rearea unui obiect )5+ped%uer+, care stabileste tipul rezultatului cererii(
- *xecutarea cererii folosind metoda )get>esult&ist, din )5+ped%uer+,.
*xemplu de obtinere a unei liste cu toti #uctorii:
4
!riteriauildercb1em.get!riteriauilder-/(
!riteria%uer+6Pla+er7cB1cb.create%uer+-Pla+er.class/(
>oot6Pla+er7p1cB.from-Pla+er.class/(
cB.select-p/(
5+ped%uer+6Pla+er7B1em.create%uer+-cB/(
&ist6Pla+er7allPla+ers1B.get>esult&ist-/(
$ec'enta anterioar este ec0i'alent cu cererea JP%& urmtoare:
&ist6Pla+er7 pla+ers 1 em.create%uer+ -Cselect p from Pla+er p )/
.get>esult&ist-/(
<biectul ?p@" rezultat al metodei )from," se numeste obiect )cale de na'igare, -)pat0 ob#ect,/"
iar aici este si )rdcin a cii de na'igare,. Alte obiecte )cale de na'igare, pot rezulta din
metoda )#oin,.
Nn obiect )cale, are o metod )get, cu un parametru proprietate a unei entitti" care permite
obtinerea 'alorii acelei proprietti. *xemplu de cerere pentru numele tuturor #uctorilor:
>oot6Pla+er7p1cB.from-Pla+er.class/(
cB.select -p.get-Pla+er.name//(
Atributul unei entitti" obtinut cu metoda )get," poate fi folosit n metoda )80ere, pentru a
selecta obiectele care satisfac anumite conditii aplicate acelui atribut -sau conditii compuse pe
mai multe atribute/.
Metodele )80ere," )0a'ing, si )select, au un argument de tipul )*xpression," care este o
expresie conditional ce foloseste anumite cu'inte c0eie si are rezultat )true, sau )false,.
*xemplu de cutare a unui #uctor cu nume cunoscut:
>oot6Pla+er7 pla+er 1 cB.from-Pla+er.class/(
cB.80ere- cb.eBual-
pla+er.get-Pla+er.name/" )MiRe,//(
cB.select-pla+er/(
5+ped%uer+6Pla+er7 B 1 em.create%uer+-cB/(
&ist 6Pla+er7 pla+ers 1 B.get>esult&ist-/(
$i aici se poate folosi o nlntuire de metode astfel:
cB.select -pla+er/.
80ere- cb.liRe -
pla+er.get-Pla+er.name/" )MiS,//(
*xist si o 'ariant cu metoda )setParameter, care seamn mai mult cu cererile JP%& dar
care complic mai mult cererile cu criterii. *xemplu:
>oot6Pla+er7 pla+er 1 cB.from-Pla+er.class/(
cB.80ere- cb.eBual-
pla+er.get-)name,/" cb.parameter-$tring.class",name,//(
cB.select-pla+er/(
5+ped%uer+6Pla+er7 tB 1 em.create%uer+-cB/(
tB.setParameter-)name," )MiRe,/(
&ist 6Pla+er7 pla+ers 1 tB.get>esult&ist-/(
!u'inte c0eie ce pot fi folosite n expresii conditionale din )80ere, si )0a'ing,:
is9ull" is9ot9ull" in
5
eBual" not*Bual" liRe" gt" ge" lt" le" bet8een
and" or" not
*xemplu de obtinere #uctori cu salariul ntre dou limite date:
>oot6Pla+er7 pla+er 1 cB.from-Pla+er.class/(
cB.80ere- cb.bet8een-
pla+er.get-Pla+er.salar+/" lo8" 0ig0//(
cB.select-pla+er/.distinct-true/(
5+ped%uer+6Pla+er7 B 1 em.create%uer+-cB/(
pla+ers 1 B.get>esult&ist-/(
*ste posibil s existe dou puncte de pornire n na'igare" de la entitti diferite sau de acelasi
tip. *xemplu de obtinere a#uctorilor cu un salariu mai mare dec2t salariul unui #uctor dat:
>oot6Pla+er7 pla+erD 1 cB.from-Pla+er.class/(
>oot6Pla+er7 pla+erQ 1 cB.from-Pla+er.class/(
Predicate gtPredicate 1 cb.greater50an-
pla+erD.get-Pla+er.salar+/"
pla+erQ.get-Pla+er.salar+//(
Predicate eBualPredicate 1 cb.eBual-
pla+erD.get-Pla+er.name/" name/(
cB.80ere-gtPredicate" eBualPredicate/(
cB.select-pla+erD/.distinct-true/(
5+ped%uer+6Pla+er7 B 1 em.create%uer+-cB/(
pla+ers 1 B.get>esult&ist-/(
Metoda )#oin, se foloseste pentru na'igarea pe asocieri dintre entitti diferite. *xemplu de
obtinere a unei liste cu #uctorii care practic un anumit sport:
>oot6Pla+er7 pla+er 1 cB.from-Pla+er.class/(
Join6Pla+er" 5eam7 team 1 pla+er.#oin-Pla+er.teams/(
Join65eam" &eague7 league 1 team.#oin-5eam.league/(
cB.80ere- cb.eBual-
league.get-&eague.sport/"
sport//(
cB.select-pla+er/.distinct-true/(
5+ped%uer+6Pla+er7 B 1 em.create%uer+-cB/(
pla+ers 1 B.get>esult&ist-/(
I&I<K>AHI*:
<racle : 50e Ja'a ** T 5utorial -QUDU/
!0. QQ: 50e Ja'a Persistence %uer+ language
!0. QV: Nsing t0e !riteria API to !reate %ueries
Antonio Koncal'es: eginning Ja'a ** T Platform 8it0 Klassfis0 V: Hrom 9o'ice to
Professional" Apress" QUDU
JI*>9A5*: Jibernate *ntit+ Manager" Nser Kuide" V.W.UKA
6

S-ar putea să vă placă și