Vous êtes sur la page 1sur 59

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Consultas e a EJB-QL
ltima reviso: 05/06/2008

1 - Introduo

Consultas na Java Persistence so criadas utilizando-se tanto a linguagem de consulta EJB-QL como a SQL nativa. A EJB-QL uma linguagem de consulta personalizada para o trabalho com objetos Java em vez de um esquema relacional. Para voc executar consultas, voc referencia as propriedades e os relacionamento de seus beans de entidade em vez das tabelas e coluna subjacentes. Quando uma consulta EJB-QL executada, o gerenciador de entidades utiliza as informaes que voc forneceu por meio dos metadados de mapeamento, discutidos anteriormente e automaticamente converte essas informaes em uma (ou vrias) consultas nativas SQL. Essa SQL gerada ento executada por um driver JDBC diretamente sobre o banco de dados. Como a EJB QL uma linguagem de consulta que representa objetos Java, ela portvel para diferentes SGBDs, porque o gerenciador da entidade trata a converso SQL para voc. Normalmente as consultas so muito mais compactas e legveis que suas equivalentes na SQL. s vezes, porm, a EJB-QL no suficiente. Como uma linguagem de consulta portvel, ela nem sempre tira proveito dos recursos proprietrios especficos do seu fornecedor de banco de dados. Por exemplo, a EJB-QL no permite executar Stored Procedures. O EJB Expert Group previu a necessidade disso e forneceu uma API para mapear chamadas SQL nativas para seus beans de entidade. Consultas EJB-QL e consultas SQL nativas so executadas por meio da

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

interface javax.persistence.Query. A interface Query muito semelhante interface java.sql.PreparedStatement do JDBC Essa API fornece mtodos para paginar seus conjuntos de resultados e tambm para passar parmetros Java para sua consulta. As consultas podem ser pr-declaradas por meio de anotaes, de XML ou criadas dinamicamente em tempo de execuo pelas API do EntityManager.

Os principais mtodos da interface Query so: public List getResultList() public Object getSingleResult() public int executUpdate() As consultas so criadas utilizando-se estes mtodos EntityManager :

public Query createQuery(String ejbqlString) public Query createNamedQuery(String nome) public Query createNativeQuery(String sqlString) public Query createNativeQuery(String sqlString, Class classeResultado) public Query createNativeQuery(String sqlString, String resultSetMapping)

Vamos examinar o uso do mtodo createQuery() para criar uma consulta dinamicamente em tempo de execuo

try { Query consulta = entityManager.createQuery( SELECT c from Cliente c where c.nome='Roberto' and + c.sobrenome='Santos' ); Cliente cliente = (Cliente)consulta.getSingleResult();

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

} catch(EntityNotFoundException n) { } catch (NonUniqueResultException no) { }

A consulta anterior procura uma nica entidade Cliente com o nome de Roberto Santos. Essa consulta executada quando o mtodo getSingleResult ( ) chamado. Esse mtodo espera que a chamada retome somente um resultado. Se nenhum resultado for retomado, o mtodo ento chamar uma exceo javax.persistence.EntityNotFoundException em tempo de execuo. Se mais de um resultado for locali ado, ento uma exceo javax. persistenece.NonUniqueResultException em tempo de execuo ser chamada. !omo essas duas exce"es so Runti eException, o pro#ramador no tem a o$ri#ao de tratar essas exce"es. % uma $oa chance de que a NonUniqueResultException se&a lanada por esse exemplo. Acredite ou no, h um uma #rande quantidade de 'o$erto Santos no mundo (tente fa er uma pesquisa no (oo#le) e esse nome parece ser to comum quanto )ohn Smith nos E*A. +oc, pode alterar a consulta a fim de utili ar o mtodo getResult!ist( ) para o$ter uma coleo de resultados-

.uer/ quer/ 0 entit/1ana#er.create.uer/( 2SE3E!4 c from !liente c 5here c.nome06'o$erto6 7 8 7 and c.so$renome06Santos62)9 &a:a.util.3ist santos 0 query.getResult!ist" #9

; mtodo getResult!ist( ) no chama uma exceo se no hou:er nenhum 'o$erto Santos. A lista retomada estaria simplesmente :a ia. ;s literais Roberto Santos e R$%ER&$ S'N&$S so interpretados da mesma forma pelo ()' 'epare que a consulta feita em n<:el de o$&etos e portanto Cliente e no e so diferentes de C!*EN&E e N$+E

,., - )ar. etros

A E/%-0! permite especificar par=metros nas declara"es de consulta para que :oc, possa reutili ar e executar a consulta mltiplas :e es em diferentes con&untos de par=metros)

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

pu$lic 3ist>!liente? encontrar@orAome(Strin# nome, Strin# so$renome) B .uer/ quer/ 0 entit/1ana#er.create.uer/(2Select c from !liente c 5here c.nome12no e and c.so$renome12sobreno e2)9 quer/.set@arameter(2nome2, nome)9 quer/.set@arameter(2so$renome2, so$renome)9 return quer/.#et'esult3ist( )9 C ; caractere 2 se#uido pelo nome de par=metro utili ado nas instru"es E(%0! para nomear um par=metro identificado. ; mtodo set)ara eter( ) nesse exemplo rece$e o nome do primeiro par=metro e ento o :alor real. A E(%-0! tam$m suporta par=metros posicionais. +amos modificar o exemplo anterior para :er esse modo em aopu$lic 3ist>!liente? encontrar@orAome(Strin# nome. Strin# so$renome) B .uer/ quer/ 0 entit/1ana#er.create.uer/( 2Select c from !liente c 5here c.nome0Dl and c.so$renomeDE2)9 quer/.set@arameter(l. nome)9 quer/.set@arameter(E. so$renome)9 return quer/.#et'esult3ist( )9 C

Em :e de uma string chamada com o nome da propriedade a ser parametri ada, set)ara eter( ) rece$e uma posio numrica de par=metro. ; caractere 3 utili ado em :e do caractere 2 que utili ado com par=metros identificados. F recomend:el o uso de par=metros identificados em :e de par=metros posicionais, uma :e que o cGdi#o E(%-0! tornaHse autoHdocumentado. Isso especialmente til ao tra$alhar com consultas prHdeclaradas.

,.4 - )ar. etros de 5ata

Se precisar passar par=metros java.util.5ate ou java.util.Calendar para uma consulta, ser necessrio utili ar os os mtodos set)ara eter( ) especiais-

0uery set)ara eter"String no e6 5ate valor6 &e poral&ype tipo# 0uery set)ara eter"String no e6 Calendar valor6 &e poral&ype tipo#

4emporal4/pe um tipo enu erado em (ava-

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

pacJa#e &a:ax.persistence9 pu$lic enum 4emporal4/pe B KA4E, 77 java.sql.5ate 4I1E, 77 java.sql.&i e 4I1ES4A1@ 77java.sql.&i esta p C ,.8 - )aginando Resultados

Ls :e es, uma consulta executada retoma um nmero excessi:o de resultados. @or exemplo, poder<amos exi$ir uma lista de clientes em uma p9gina :eb. Essa p9gina :eb sG pode exi$ir certo nmero de clientes e tal:e ha&a milhares ou mesmo milh"es de clientes no $anco de dados. A interface 0uery tem duas fun"es prHdefinidas para resol:er esse tipo de cenrioset+axResults( ) e setFirstResult( )-

pu$lic 3ist>!liente? #et!lientes(int max. int indice) B .uer/ quer/ 0 entit/1ana#er. create.uer/( 2Select c from !liente c2)9 return quer/.set1ax'esults(max). setMirst'esult(indice).#et'esult3ist( )9 C

; mtodo getClientes( ) executa uma consulta que o$tm todos os clientes no $anco de dados. 3imitamos o nmero de clientes retomados utili ando o mtodo set+axResults( ), passando o par=metro de mtodo ax. Esse mtodo tam$m pro&etado de modo que :oc, possa definir um con&unto ar$itrrio dos resultados que queira retomar pela execuo da consulta. ; mtodo setFirstResult( ) instrui a consulta so$re qual posio no con&unto de resultados da consulta executada :oc, quer retomar. @ortanto, se hou:esse um resultado mximo de N e um primeiro resultado de O, os clientes O, P e Q seriam retomados. !onfi#uramos esse :alor no mtodo getClientes( ) com o par=metro indice. +amos pe#ar esse mtodo e escre:er um fra#mento de cGdi#o que lista todos os clientes do $anco de dados-

3ist resultados9 int primeiro 0 R 9 int max 0 SR9 do B resultados 0 getClientes" ax6 pri eiro#9

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Iterator it 0 resultados.iterator( )9 5hile (it.hasAext()) B !liente c 0 (!liente)it.next( )9 S/stem.out.println(c.#etAome() 8 2 2 8 c.#etSo$renome()9 entity+anager. clear" #; primeiro 0 primeiro 8 resultados.#etSi e( )9 C 5hile (resultados.si e( ) ? R)9 Aesse exemplo, fa emos um loop por todos os clientes do $anco de dados e exi$imos seus primeiros nomes e so$renomes. Se ti:ssemos milhares ou mesmo milh"es de clientes no $anco de dados, o sistema poderia rapidamente ficar sem memGria, :isto que cada execuo do mtodo getClientes" # retomaria os clientes que continua:am sendo #erenciados pelo #erenciador de entidade. Assim, depois de terminamos de #erar a sa<da de um $loco de clientes, chamamos o <todo clear"# de Entity+anager para desacoplar esses clientes e deixar que se&am eliminados pelo coletor de lixo da 9quina virtual (ava. *tili e esse padro se precisar lidar com uma #rande quantidade de o$&etos de entidade dentro da mesma transao. ,.= - Flus>+ode

()' fornece dois odos de ?lus> para o$&etos do tipo 0uery- 'U&$ e C$++*& respecti:amente (so definidos no tipo enumerado Flus>+ode&ype). Se o odo 'U&$ for confi#urado no objeto 0uery (este o comportamento default), ento quaisquer mudanas feitas no o$&eto entidade sero refletidas na prGxima :e que uma consulta select for feita . Isso si#nifica que o ?ra e:or@ de persistAncia de:e asse#urar a atuali ao de todos os estados dos o$&etos entidade que iro afetar os resultados das consultas SE!EC&. ; odo de ?lus> C$++*& pode ser confi#urado conforme exemplo a$aixo-

.uer/ quer/ 0 entit/1ana#er.create.uer/(2SE3E!4 c M';1 !liente c2)9 quer/.setMlush1ode(Mlush1ode4/pe.!;11I4)9 Aesse exemplo, o ?ra e:or@ apenas pode atuali ar todos os estados das entidades durante um C$++*& no $anco de dados. Em outras pala:ras, estamos instruindo o pro:edor de persist,ncia de que no queremos que a

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

consulta faa nenhuma atuali ao automtica antes de essa consulta particular ser executada. *tili ar esse modo de confirmao pode ser peri#oso se hou:er entidades correlacionadas no totalmente #ra:adasTatuali adas no contexto da persist,ncia. 4al:e :oc, retorne entidades erradas a partir de sua consulta. @ortanto, recomend:el utili ar o Flus>+ode&ype .'U&$.

; mtodo setFlus>+ode"Flus>+ode&ype# est dispon<:el tanto em Entity+anager quanto na inter?ace 0uery. Se o Entity+anager for confi#urado com setFlus>+ode"Flus>+ode&ype.'U&$# e o objeto 0uery for in:ocado com setFlus>+ode"Flus>+ode&ype.C$++*&#, a prefer,ncia sempre ser do objeto 0uery.

4 - E(%-0!

A#ora que :oc, tem um entendimento $sico de como tra$alhar com o$&etos 0uery, poder aprender so$re os recursos dispon<:eis para criar suas prGprias consultas E(%-0!. A E(%-0! expressa em termos do esque a abstrato de persistAncia de uma entidade- seu nome de esquema a$strato, propriedades $sicas e propriedades de relacionamento. A E(%-0! utili a os nomes do esquema a$strato para identificar beans, as propriedades $sicas para especificar :alores e as propriedades de relacionamento para na:e#ar por diferentes relacionamentos. Em nossa discusso da E(%-0!, utili aremos os relacionamentos entre as entidades Cliente6 Endereco6 Cartao6 CruBeiro6 Navio6 Reserva e Cabine definidas anteriormente.

4., - No es do esque a abstrato

; nome do esquema a$strato pode ser definido pelos etadados ou pode assumir o padro de um :alor espec<fico. Ele assume o padro do no e noquali?icado da classe bean de entidade (nome sem o pacote) se o atri$uto na e" # no for especificado ao declarar a anotao CEntity. Ao exemplo a se#uir, o atri$uto na e"# de UEntity no especificado na classe bean Cliente, assim o nome Cliente utili ado para referenciar a entidade dentro das chamadas E(%-0!-

UEntit/

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

pu$lic class !liente B ... C entit/1ana#er.create.uer/(7SE3E!4 c M';1 Cliente AS cV ) Ao exemplo a$aixo, uma :e que o atri$uto na e"# de UEntity foi definido, :oc, referenciaria entidades Cliente na E(%-0! como 7CliVCEntity"na e1DCliD# pu$lic class !liente B ... C entit/1ana#er.create.uer/(7SE3E!4 c M';1 Cli AS cV)9 4.4 - Consultas si ples

A instruo E(%-0! mais simples no tem nenhuma cl9usula EFERE e sG tem um tipo de esquema a$strato. @or exemplo, :oc, poderia definir um mtodo de consulta para selecionar todos os beans Cliente-

SE!EC& $%(EC&" c # FR$+ Cliente 'S c

A cl9usula FR$+ determina quais tipos de bean de entidade sero inclu<dos na instruo SE!EC& (isto , ela fornece o escopo de SE!EC&). Aesse caso, a cl9usula FR$+ declara o tipo como Cliente, que o nome do esquema a$strato da entidade Cliente. A parte 'S c da clusula atri$ui c como o identificador da entidade Cliente. Isso semelhante W S0!, que permite que um identificador se&a associado a uma ta$ela. ;s identificadores podem ter qualquer comprimento e de:em se#uir as mesmas re#ras aplicadas aos nomes dos campos na linguage de progra ao (ava. Entretanto, identificadores no podem ter os mesmos :alores que os existentes no nome do esquema a$strato. As duas instru"es a se#uir so equi:alentes-

SE!EC& $%(EC&"c# FR$+ Cliente 'S c SE!EC& c FR$+ Cliente c

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A cl9usula SE!EC& determina o tipo de quaisquer :alores retomados. Aesse caso, a instruo retoma o bean de entidade Cliente, como indicado pelo identi?icador c. ; operador $%(EC& " # opcional e um le#ado da especificao E(% 4.,. Ele est a< por ra "es de retroHcompati$ilidade. ;s identificadores no podem ser pala:ras reser:adas na E(%-0!. Aa (ava )ersistence, estas pala:ras so reser:adas- SE3E!4, M';1, X%E'E, *@KA4E, KE3E4E, Y;IA, ;*4E', IAAE', (';*@, Z[, %A+IA(, ME4!%, KIS4IA!4, ;ZYE!4, A*33, 4'*E, MA3SE, A;4, AAK, ;', ZE4XEEA, 3I\E, IA, AS, *A\A;XA, E1@4[, 1E1ZE', ;M, IS, A+(, 1A], 1IA, S*1, !;*A4, ;'KE' AS!, KES!, 1;K, *@@E', 3;XE', 4'I1, @;SI4I;A, !%A'A!4E'^3EA(4%, !%A'^3EA(4%, ZI4^3EA(4%, !*''EA4^4I1E, !*''EA4^KA4E, !*''EA4^4I1ES4A1@, e AEX. *ma $oa prtica e:itar todas palavras reservadas da S0!, porque :oc, nunca sa$e quais sero utili adas nas :ers"es futuras da E(%-0!. +oc, pode encontrar informa"es adicionais no ap,ndice do li:ro S0! in a Nuts>ell "$GReilly#,

4.8 - Selecionando propriedades de entidade e de relaciona ento

A E(%-0! permite que a cl9usula SE!EC& retome quaisquer propriedades $sicas ou de relacionamento. @or exemplo, podemos definir uma instruo SE!EC& simples para que ela retome os primeiros nomes e os so$renomes de todos os clientes do CruBeiro &itan SE!EC& c.no e6 c.sobreno e FR$+ Cliente 'S c

A cl9usula SE!EC& utili a um caminho simples para selecionar as propriedades no e e sobreno e da entidade Cliente como o tipo de retomo. ;s nomes da propriedade de persist,ncia so identificados pelo tipo de acesso de seu bean de entidade, independentemente de suas anota"es de mapeamento terem sido aplicadas a um mtodo get ou set ou aos campos do mem$ro da classe. Se utili ar mtodos get ou set para especificar suas propriedades persistentes, o nome da propriedade ser ento extra<do do nome do mtodo. A parte get do

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

nome do mtodo remo:ida, e o primeiro caractere da string restante permanece em letras minsculasUEntit/ pu$lic class !liente B pri:ate int id9 pri:ate Strin# nome9 pri:ate Strin# so$renome9 UId pu$lic int #etId( ) B return id9 C pu$lic Strin# #etAome( ) B return nome9 C pu$lic Strin# #etSo$renome( ) B return so$renome9 C Aesse exemplo, estamos utili ando os mtodos get e set para definir nossas propriedades persistentes. A cl9usula SE!EC& iria se parecer com istoSE!EC& c.no e6 c.sobreno e FR$+ Cliente 'S c

Se :oc, esti:er mapeando sua entidade diretamente para os campos do seu bean, ento o nome de campo ser utili ado na clusula SE!EC&-

UEntit/ pu$lic class !liente B UId pri:ate int id9 pri:ate Strin# name9 pri:ate Strin# surname9 C

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Essa instruo E(%-0! de exemplo precisaria ser reescrita com os nomes das propriedades no e e sobreno e modificadosSE!EC& c.na e6 c.surna e FR$+ Cliente 'S c

.uando uma consulta retorna mais de um item, :oc, precisa utili ar o mtodo getResult!ist"# de 0uery. Se a cl9usula SE!EC& consultar mais de uma coluna ou entidade, os resultados sero a#re#ados em um array de objetos ($bjectH/) na java.util.!ist retomada pelo getResult!ist ( ). ; cGdi#o a se#uir mostra como acessar os resultados retomados-

.uer/ quer/ 0 entit/1ana#er.ereate.uer/( 2SE3E!4 c.nome, c.so$renome M';1 !liente AS c2)9 3ist resultados 0 quer/.#et'esult3ist( )9 Iterator it 0 resultados.iterator( )9 5hile(it.hasAext( ) )B $bjectH/ resultado1 "$bjectH/#it.next"#; Strin# nome 0 (Strin#)resultado_R)9 Strin# so$renome 0 (Strin#)resultado_l)9 C

+oc, tam$m pode utili ar tipos de campos de relacionamento de :alor nico nas instruIes SE!EC& simples. A instruo E(%-0! a se#uir seleciona todos os CartIes a partir de suas entidades Cliente relacionadasSE!EC& c.cartao5eCredito FR$+ Cliente 'S c

Aesse caso, a instruo E(%-0! utili a as interli#a"es para na:e#ar de Clientes ao seus campos de relacionamento cartao5eCredito. ; identificador cartao5eCredito o$tido pelas mesmas re#ras do tipo de acesso das propriedades $sicas. As interli#a"es podem che#ar a qualquer o$&eto que for necessrio. F comum utili ar interli#a"es que na:e#am por um ou mais campos de relacionamento e que terminam em uma propriedade $sica ou em uma propriedade de relacionamento. @or exemplo, esta instruo E(%-0! seleciona todos os campos cidade de todos os Endereos em cada ClienteSE!EC& c.endereco.cidade FR$+ Cliente 'S c

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Aesse caso, utili ado o nome de esquema a$strato do Cliente, o campo de relacionamento endereco do Cliente e o campo cidade do Endereco. @ara ilustrar interli#a"es mais complexas, precisaremos expandir o dia#rama de classes A Mi#ura a$aixo mostra que Cartao est relacionada com E presaCartao que tem um Endereco prGprio.

*tili ando esses relacionamentos, podemos especificar uma interli#ao mais complexa que na:e#a do Cliente para E presaCartao e para o Endereco. Eis uma instruo E(%-0! que seleciona os endereos de todas as empresas de carto de crdito utili ados pelos clientes do &itanSE!EC& c.cartao5eCredito.e presaCartao.endereco FR$+ Cliente 'S c

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A instruo E(%-0! tam$m poderia na:e#ar at os campos do bean Endereco. A instruo a se#uir seleciona todas as cidades onde as empresas de carto de crdito que distri$uem cart"es de crdito utili ados pelos clientes do &itan esto $aseadasSE!EC& c.cartao5eCredito.e presaCartao.endereco.cidade FR$+ Cliente 'S c

;$ser:e que essas instru"es E(%-0! retomam as propriedades de relacionamento endereco ou as propriedades cidade somente para aquelas empresas de carto de crdito respons:eis pelos cart"es cu&os proprietrios so clientes do &itan. As informa"es so$re o endereo de uma das empresas de carto de crdito cu&os cart"es no so atualmente utili ados pelos clientes do &itan no so inclu<das nos resultados. As interli#a"es no podem che#ar alm das propriedades persistentes. @or exemplo, ima#ine que Endereco utili e uma classe CE) como sua propriedade cep e essa propriedade se&a arma enada como um fluxo de $/tes no $anco de dados-

pu$lic class !E@ implements &a:a.io.Seriali a$le B pu$lic int codi#o@rincipal9 pu$lic int sufixo9 C UEntit/ pu$lic class Endereco B pri:ate !E@ cep9 C

+oc, no pode na:e#ar at um dos campos de inst=ncia !E@ da classe// isso ile#al SE!EC& c.endereco.cep.codigo)rincipal FR$+ Cliente 'S c

Aaturalmente, :oc, poderia tornar a classe Cep CE beddable. Se fi esse isso, :oc, ento poderia o$ter as propriedades da classe !ep-

pu$lic class !ep implements &a:a.io.Seriali a$le B

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

pu$lic int codi#o@rincipal9 pu$lic int sufixo9 UEntit/ pu$lic class Endereco B CE bedded pri:ate !ep cep9

Essa E(%-0! a#ora seria :lida// CE bedded torna isso v9lido SE!EC& c.endereco.cep.codigo)rincipal FR$+ Cliente 'S c F Ile#al na:e#ar por um campo de relacionamento $aseado em coleo. A instruo E(%-0! a se#uir ile#al, mesmo que o caminho termine em um campo de relacionamento de tipo nicoTTisso ile#al SE!EC& c.reservas.cruBeiro FR$+ Cliente 'S c

Se pensar so$re isso, :er que essa limitao fa sentido. +oc, no pode utili ar um operador de na:e#ao (.) no (ava para acessar elementos de um o$&eto java.util.Collection. @or exemplo, se getReservas " # retornar um tipo java.util.Collection, essa instruo ser ile#al-

TT isso ile#al na lin#ua#em de pro#ramao Ya:a cliente.#et'eser:as( ).#et!ru eiro( )9

F poss<:el referenciar os elementos de um campo de relacionamento com $ase em uma coleo, mas isso exi#e o uso de um operador *N ou ($*N e uma atri$uio de identificao na cl9usula FR$+.

4.= - ExpressIes de Construtor

*m dos recursos mais poderosos da E(%-0! a capacidade de especificar um construtor dentro da cl9usula SE!EC&, que pode alocar objetos (ava simples (noHentidades), e passar as colunas que :oc, seleciona nesse construtor. @or exemplo, di#amos que queiramos a#re#ar os primeiros nomes e so$renomes de nossa entidade Cliente a um $bjeto (ava simples chamado No e2

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

pu$lic class AomeB pri:ate Strin# nome9 pri:ate Strin# so$renome9 pu$lic Aome(Strin# nome, Strin# so$renome) B this.nome 0 nome9 this.so$renome 0 so$renome9 C pu$lic Strin# #etAome( ) B return this.nome9 C pu$lic Strin# #etSo$renome( ) B return this.so$renome9 C C

Aa :erdade, podemos fa er com que nossa consulta retome uma lista das classes No e em :e de uma lista simples de Strin#s. Ma emos isso chamando o construtor de No e diretamente de dentro de nossa consulta-

SE!EC& ne: co .titan.do inio.No e"c.no e6 c.sobreno e# FR$+ Cliente c

; objeto 0uery alocar automaticamente uma inst=ncia de No e a cada linha retomada, passando as colunas no e e sobreno e como ar#umentos para o construtor de No e. Esse recurso incri:elmente til para #erar relatGrios di#itados e pode poupar uma #rande quantidade de di#itao.

4.J - $s operadores *N e *NNER ($*N

1uitos relacionamentos entre os beans de entidade esto $aseados em cole"es, de modo que ser capa de acessar e selecionar beans a partir desses relacionamentos importante. +imos que ile#al selecionar elementos diretamente de um relacionamento $aseado em coleo. @ara superar essa limitao a E(%-0! introdu iu o operador *N, que permite que um identificador represente elementos indi:iduais em um campo de relacionamento $aseado em coleo.

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A consulta a se#uir utili a o operador *N para selecionar os elementos de um relacionamento $aseado em coleo. Esse operador retorna todas as reser:as de todos os clientes-

SE!EC& r FR$+ Cliente 'S c6 *N" c.reservas # r ; operador *N atri$ui os elementos indi:iduais na propriedade reser:as ao identi?icador r. Kepois que temos um identificador para representar os elementos indi:iduais da coleo, podemos referenciHlo diretamente e selecionHlo na instruo E(%-0!. 4am$m podemos utili ar o identificador de elemento nas express"es de caminho. @or exemplo, esta instruo seleciona cada cru eiro em que os clientes do &itan fi eram reser:asSE!EC& r.cruBeiro FR$+ Cliente 'S c6 *N" c.reservas # r

;s identificadores atri$u<dos na cl9usula FR$+ so a:aliados da esquerda para a direita. Kepois de declarar um identificador, :oc, pode utili Hlo nas declara"es su$seq`entes na cl9usula FR$+. ; identi?icador c, que foi declarado primeiro, foi su$seq`entemente utili ado no operador *N para definir o identi?icador r. Essa consulta tam$m pode ser expressa como uma *NNER ($*N-

SE!EC& r. cruBeiro FR$+ Cliente c *NNER ($*N c.reservas r

A sintaxe *NNER ($*N fa um paralelo com a linguage S0! muito melhor e mais intuiti:a para desen:ol:edores pro:enientes do mundo relacional. As cadeias de identificao podem tornarHse muito lon#as. A instruo a se#uir utili a dois operadores *N para na:e#ar pelos dois relacionamentos $aseados em cole"es e por um nico relacionamento. Em$ora no se&a necessariamente til, essa instruo demonstra como uma consulta pode utili ar operadores *N em diferentes relacionamentos.

SE!EC& cbn.navio

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

FR$+ Cliente 'S c6 *N " c.reservas # r6 *N" r.cabines # cbn !omo opo, mais uma :e , a sintaxe *NNER ($*N poderia ser utili adaSE!EC& cbn.navio FR$+ Cliente 'S c *NNER ($*N c.reservas r *NNER ($*N r.cabines cbn Essas consultas selecionam todos os na:ios em que os clientes t,m reser:as. A palavra-c>ave *NNER na :erdade opcional, assim a consulta pr:ia poderia ser reescrita desta forma

SE!EC& cbn.navio FR$+ Cliente c ($*N c.reservas r ($*N r.cabines cbn 4.K - !EF& ($*N

A sintaxe !EF& ($*N permite a recuperao de um con&unto de entidades em que tal:e no existam :alores correspondentes na instruo de &uno. @ara :alores no existentes, um :alor nulo colocado no con&unto de resultados. @or exemplo, suponha que queiramos #erar um relatGrio com o no e de u cliente e com todos os nL eros de tele?one desse cliente. Al#uns clientes tal:e no tenham especificado um nmero de telefone, mas ainda queremos listar seus nomes. *tili ar<amos uma !EF& ($*N para o$ter todas essas informa"es, incluindo os clientes sem nmeros de telefone-

SE!EC& c.no e6 c.sobreno e6 ?.nu ero FR$+ Cliente c !EF& ($*N ?.nu ero&ele?ones ?

Se hou:esse tr,s clientes no nosso sistema e %ill %ur@e no ti:esse fornecido nenhum nmero de telefone, os :alores de retorno poderiam se parecer com-

Ka:id ;rti PSQHOOOHRaRR Ka:id ;rti PSQHOOOHaaaa 4rot Aixon QbSHOOOcENEN %ill %ur@e null

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A consulta anterior tam$m pode ser expressa como uma !EF& $U&ER ($*N. Isso apenas um exemplo da sintaxe para fa er um paralelo com a S0! M4.

SE!EC& c.no e6 c.sobreno e6 ?.nu ero FR$+ Cliente c !EF& $U&ER ($*N c. nu ero&ele?ones ? 4.N O ($*N FE&CF

A sintaxe ($*N FE&CF permite prHcarre#ar os relacionamentos de uma entidade retornada mesmo se a propriedade de relacionamento ti:er um Fetc>&ype do tipo !'PQ. @or exemplo, di#amos que nosso relacionamento de um para muitos de Cliente para &ele?one tenha sido definido da se#uinte maneira-

U;ne4o1an/(?etc>1Fetc>&ype.!'PQ) pu$lic !ollection>4elefone? #et4elefones( ) B return telefones9 C

Se quisssemos imprimir todas as informa"es so$re os clientes, incluindo seus nmeros de telefone, normalmente sG far<amos uma consulta para todos os clientes e ento atra:essar<amos o <todo get&ele?ones" # dentro de um loop ?or-

.uer/ quer/ 0 entit/1ana#er. create.uer/( 2SE3E!4 c M';1 !liente c2)9 77 , 3ist resultados 0 quer/.#et'esult3ist( )9 Iterator it 0 resultados.iterator( )9 5hile (it.hasAext( )) B !liente c 0 (!liente)it.next( )9 S/stem.out.print(c.#etAome( ) 8 2 2 8 c.#etSo$renome( ))9 for (4elefone t - c.#et4elefones( )) B 77 N S/tem.out.print(t.#etAumero( ) 82 2)9 C S/stem.out.println(7V)9 C

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

% pro$lemas de desempenho com o cGdi#o anterior. !omo o relaciona ento de &ele?one anotado como sendo carre#ado so$ demanda no bean Cliente, a coleo de &ele?ones no ser iniciada quando fi ermos a consulta inicial ,. .uando get&ele?ones" # executado na !in>a N, o mecanismo de persist,ncia tem de fa er uma consulta adicional a fim de o$ter as entidades &ele?one associadas ao cliente. Isso chamado proble a N R ,, :isto que temos de fa er N consultas extras alm da nossa consulta inicial. Ao a&ustar os aplicati:os $aseados em $anco de dados, sempre importante redu ir o mximo poss<:el o nmero de :ia#ens de ida e :olta feita ao $anco de dados. Isso onde a sintaxe ($*N FE&CF entra em cena. +amos modificar nossa consulta para prHcarre#ar a associao 4elefone-

SE!EC& c FR$+ Cliente c !EF& ($*N FE&CF c.tele?ones

*tili ar !EF& ($*N FE&CF prHcarre#ar adicionalmente a associao 4elefone. Isso pode ter um efeito si#nificati:o so$re o desempenho, porque, em :e de A 8 S consultas, somente uma consulta feita no $anco de dados.

4.S - Usando 5*S&*NC&

A palavra-c>ave 5*S&*NC& asse#ura que a consulta no retome resultados duplicados. @or exemplo, a consulta a se#uir locali a todo os clientes com reser:as. Essa consulta retomar duplicatas-

SE!EC& res FR$+ Reserva 'S res6 *N "res.clientes# cli

Se um cliente ti:er mais de uma reser:a, ha:er refer,ncias duplicadas a esse cliente no resultado. *tili ar a palavra c>ave 5*S&*NC& asse#ura que cada cliente se&a representado apenas uma :e no resultado-

SE!EC& 5*S&*NC& cli FR$+ Reserva 'S res6 *N"res.clientes# cli 4.M - ' cl9usula EFERE e literais

+oc, pode utili ar :alores literais para diminuir o escopo dos elementos selecionados. Isso reali ado pela cl9usula EFERE, que t,m um comportamento semelhante W cl9usula EFERE na S0!.

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

@or exemplo, :oc, pode definir uma instruo E(%-0! que seleciona todas as entidades Cliente que utili am um carto de crdito espec<fico. ; literal nesse caso um literal String. 3iterais do tipo String so inclu<dos usando aspas si ples. A instruo a se#uir retoma clientes que usam cartIes de cr<dito T*S'. (Se :oc, no quiser se incomodar com tais detalhes, utili e um par=metro de consulta9 o tra$alho ser feito para :oc, pela A@I de consulta).

SE!EC& c FR$+ Cliente 'S c EFERE c.cartao5eCredito.e presaCartao.no e 1 GT*S'G

Express"es de interli#ao na cl9usula EFERE so utili adas da mesma maneira como na cl9usula SE!EC&. Ao fa er compara"es !om um literal, a expresso de interli#ao de:e ser a:aliada de acordo com uma propriedade $sica. +oc, no pode comparar um campo de relacionamento com um literal. Alm das literais strings, os literais podem ser valores nu <ricos exatos "tipos inteiros# e valores nu <ricos aproxi ados "tipos double#. +alores literais numricos exatos so expressos utili andoHse a sintaxe de literal de inteiro do Ya:a (NES, HbaNE, 8EE). +alores literais numricos aproximados so expressos com a sintaxe de ponto flutuante do Ya:a na notao cient<fica (OEN, Hb.aNEEO) ou decimal (O.ENd, NbEbE.E). @or exemplo, esta instruo E/%-0! seleciona todos os na:ios que pesam SRR.RRR toneladas-

SE!EC& s FR$+ Navio 'S s EFERE s.tonelage

1 ,UUUUU.UU

+alores literais $ooleanos utili am &RUE e F'!SE. Eis uma instruo E/%0! que seleciona todos os clientes que t,m crdito-

SE!EC& c FR$+ Cliente 'S c EFERE c.te %o Credito 1 &RUE 4.,U - ' cl9usula EFERE e a precedAncia de operador

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A cl9usula EFERE composta de express"es condicionais que redu em o escopo da consulta e limitam o nmero de itens selecionados. +rios operadores condicionais e lG#icos podem ser utili ados nas express"es9 eles esto listados aqui em ordem de preced,ncia $perador de navegao (.) $peradores arit <ticos- 8, H (unrio)9 e, T (multiplicao e di:iso)9 8, H (adio e su$trao) $peradores de co parao- 0, ?, ?0, >, >0, >? (diferente), 3I\E, ZE4XEEA, SA, SS A*33, SS E1@4[, 1E1ZE' ;M $peradores lVgicos- A;4, AAK, ;'

4.,U., - ' cl9usula EFERE e operadores arit <ticos

;s operadores aritmticos permitem que uma consulta reali e a aritmtica no processo de fa er uma comparao. ;s operadores aritmticos sG podem ser utili ados na cl9usula EFERE, no na cl9usula SE!EC&.

As instruIes E/%-0! a se#uir retomam refer,ncias a todos as reser:as dos quais sero co$rados uma taxa porturia de mais de 'f NRSE!EC& r FR$+ Reserva 'S r EFERE "r.valor)ago W .U,# X 8U.UU

As re#ras aplicadas Ws opera"es aritmticas so as mesmas que as utili adas na lin#ua#em de pro#ramao Ya:a, em que os nmeros so aumentados ou promo:idos, no processo da reali ao de um clculo. @or exemplo, multiplicar um double e um :alor int requer que o primeiro int se&a promo:ido a um :alor double. (; resultado sempre ser o maior tipo utili ado no clculo, portanto multiplicar um int e um double resulta em um :alor double.) String, boolean e tipos de o$&etos de entidade no podem ser utili ados nas opera"es aritmticas. @or exemplo, o uso do operador de adio com dois :alores String considerado uma operao ile#al. % uma funo especial

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

para concatenar valores String a$ordada mais adiante neste cap<tulo na seo intitulada DExpressIes ?uncionais na cl9usula EFERED. 4.,U.4 - ' cl9usula EFERE e operadores lVgicos

;peradores lG#icos como 'N5, $R e N$& operam da mesma maneira na E/%-0! como seus operadores lG#icos correspondentes no S0!. ;peradores lG#icos sG a:aliam expressIes booleanas, assim cada operando (isto , cada lado da expresso) de:e ser a:aliado como true, ?alse ou NU!!. ;peradores lG#icos t,m a preced,ncia mais $aixa para que todas as express"es possam ser a:aliadas antes de elas serem aplicadas. ;s operadores 'N5 e $R no se comportam como suas contrapartes da lin#ua#em Ya:a, YY e ZZ. A E/%-0! no especifica se os operandos no lado direito so a:aliados condicionalmente. @or exemplo, o operador YY no (ava a:alia seu operando no lado direito somente se o operando no lado esquerdo for true. Ke maneira semelhante, o operador lVgico ZZ a:alia o operando no lado direito somente se o operando no lado esquerdo for ?alse. Ao podemos fa er a mesma suposio para os operadores 'N5 e $R na E(%-0!. ; fato desses operadores a:aliarem operandos no lado direito depende da lin#ua#em de consulta nati:a em que as instru"es so tradu idas. F melhor supor que os dois operandos so a:aliados em todos os operadores lG#icos. N$& simplesmente in:erte o resultado $ooleano de seu operando9 express"es que so a:aliadas para o :alor $ooleano true tornamHse ?alse e :iceH:ersa.

4.,U.8 - ' cl9usula EFERE e s[ bolos de Co parao ;s operadores de comparao, usam os s<m$olos 0, ?, ? 0, >, > 0 e >?, e no de:em ser estranhos para :oc,. A instruo a se#uir seleciona todas as entidades Aa:io cu&o campo tonela#em maior ou i#ual a bR.RRR toneladas, mas menor ou i#ual a SNR.RRR toneladasSE!EC& s FR$+ Navio 'S s EFERE s.tonelage X1 SUUUU.UU 'N5 s.tonelage \1 ,8UUUU.UU #

Somente os operadores 0 e >? (i#ual a e diferente) podem ser utili ados nos

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

identificadores $oolean de o$&etos de entidade. ;s s<m$olos maior que e menor que (?, ? 0, >, > 0) podem ser utili ados nos :alores numricos e em strin#s. Entretanto, a sem=ntica dessas opera"es no foi definida pela especi?icao (ava )ersistence. A distino entre maisculas e minsculas importanteD Espaos em $ranco iniciais e finais so importantesD .uest"es como essas afetam o ordenamento dos :alores de strin#s. @ara que a E(%-0! mantenha seu status como uma a$strao das lin#ua#ens de consultas nati:as, ela no pode ditar o ordenanao de Strings, porque as lin#ua#ens de consulta nati:as podem ter re#ras de ordenao be di?erentes. Aa realidade, mesmo diferentes fornecedores de $ancos de dados relacionais t,m diferentes opini"es so$re a questo da ordenao de Strings, o que torna quase imposs<:el padroni ar a ordenao at mesmo para $ancos de dados Gco pat[veisG com a S0!. Aaturalmente, isso tudo teoria, se :oc, plane&a usar o mesmo $anco de dados futuramente. Aesse caso, a melhor coisa a fa er examinar a documentao do $anco de dados que :oc, est utili ando a fim de desco$rir a maneira como ele ordena strin#s nas compara"es. Isso o informa exatamente so$re como suas co paraIes E(%-0! funcionaro.

2.10.4 - A Clusula WHERE e a semntica de igualdade

Em$ora se&a :lido comparar um :alor numrico exato ( s>ort6 int6 long) com um :alor numrico aproximado (double6 ?loat), todas as outras compara"es de i#ualdade de:em comparar os mesmos tipos. +oc, no pode, por exemplo, comparar um :alor String de SEN com o literal SEN *nteger. 1as :oc, pode comparar dois tipos String para i#ualdade. +oc, pode comparar :alores numricos aos quais a re#ra de promoo numrica se aplica. @or exemplo, um s>ort pode ser comparado com um int, um int com um long etc. A (ava )ersistence tam$m afirma que primiti:os podem ser comparados com empacotadores do tipo de primiti:o H as re#ras de promoo numrica se aplicam. Aas :ers"es mais anti#as dessa especificao, compara"es de tipos String tinham de corresponder exatamente com cada caractere. A E(% 4., descartou esse requisito, tornando a a:aliao de i#ualdade entre tipos String mais

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

am$<#ua.

Isso continuou na (ava )ersistence. 1ais uma :e , essa am$i#`idade resultante das diferenas entre tipos de $ancos de dados (relacional versus orientado a o$&etos versus arqui:o) e tam$m das diferenas entre os fornecedores de $ancos de dados relacionais. !onsulte a documentao do seu fornecedor para determinar exatamente como compara"es de i#ualdade do tipo String so a:aliadas. +oc, tam$m pode comparar o$&etos de entidade para i#ualdade, mas estes tam$m de:em ser do mesmo tipo. @ara ser mais espec<fico, os dois precisam ser refer,ncias de o$&etos de entidade a partir da mesma implantao. !omo um exemplo, a consulta a se#uir locali a todas as entidades Reservas feitas por um Cliente espec[?ico. Ele rece$e uma entidade !liente como um par=metro-

SE!EC& r FR$+ Reserva r6 *N " r. clientes # 'S cli EFERE clie 1 2clienteEspeci?ico

Kepois de ser determinado que o $ean o tipo correto, a comparao real reali ada nas cha:es primrias dos $eans. Se eles ti:erem a mesma cha:e primria, sero considerados i#uais. +oc, pode utili ar o$&etos java.util.5ate nas compara"es de i#ualdade. !onsulte a seo anterior intitulada D)ar. etros de data].

4.,U.J - ' cl9usula EFERE e a cl9usula %E&EEEN

A cl9usula %E&EEEN um operador inclusi:o que especifica um inter:alo de :alores. Aesse exemplo, a utili amos para selecionar todos os na:ios que pesam entre bR.RRR e SNR.RRR toneladas-

SE!EC& s FR$+ Navio 'S s EFERE s.tonelage

%E&EEEN SUUUU.UU 'N5 ,8UUUU.UU

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A cl9usula %E&EEEN sG pode ser utili ada em primiti:os numricos ( byte6 s>ort6 int6 long6 double6 ?loat) e em seus tipos java.lang.Nu ber correspondentes (%yte6 S>ort6 *nteger etc.). Ela no pode ser utili ada com String, boolean ou nas refer,ncias de o$&etos de entidade.

*tili ar o operador lVgico N$& em con&unto com %E&EEEN exclui o inter:alo especificado. @or exemplo, a instruo E(%-0! a se#uir seleciona todos os na:ios que pesam menos de bR.RRR toneladas ou mais de SNR.RRR toneladas, mas exclui tudo neste inter:aloSE!EC& s FR$+ Navio 'S s EFERE s.tonelage N$& %E&EEEN SUUUU.UU 'N5 ,8UUUU.UU

; efeito #eral dessa consulta o mesmo que se ela ti:esse sido executada com s<m$olos de comparao-

SE!EC& s FR$+ Navio 'S s EFERE s.tonelage

\ SUUUU.UU $R s.tonelage

X ,8UUUU.UU

4.,U.K - ' cl9usula EFERE e *N

o operador *N condicional utili ado na cl9usula EFERE no o mesmo do operador *N utili ado na cl9usula FR$+ (essa a ra o pela qual a palavrac>ave ($*N na cl9usula FR$+ de:e ser preferida em relao W palavrac>ave *N para na:e#ao pela coleo). Aa cl9usula EFERE, *N testa a associao em uma lista de :alores literais. @or exemplo, esta instruo E(%0! utili a o operador *N para selecionar todos os clientes que residem em uma srie espec<fica de estados-

SE!EC& c FR$+ Cliente 'S c EFERE c.endereco.estado *N "G+^G6 GR(G6 G+SG6 GRSG6 GS)G#

Aplicar o operador N$& a essa expresso in:erte a seleo, excluindo todos os clientes que residem na lista dos estados-

SE!EC& c

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

FR$+ Cliente 'S c EFERE c.endereco.estado N$& *N "G+^G6 GR(G6 G+SG6 GRSG6 GS)G#

Se o campo testado for null, o :alor da expresso ser Gdescon>ecidoG, o que si#nifica que ele no pode ser pre:isto. ; operador *N pode ser utili ado com operandos que so a:aliados para :alores de string ou :alores numricos. @or exemplo, a instruo E(%-0! a se#uir utili a o operador *N para selecionar todas as ca$ines no n<:el do con:s S,N,O e Q-

SE!EC& cab FR$+ Cabin 'S cab EFERE cab.nivelConves *N ",686J6N#

; operador *N tam$m pode ser utili ado com par=metros de entrada. @or exemplo, esta consulta seleciona todos os clientes que residem nos estados desi#nados-

SE!EC& c FR$+ Cliente 'S c EFERE c.endereco.estado *N " 3,6346386 GR(G6 G+^G#

Aesse caso, os par=metros de entrada (DS, DE e DN) so com$inados com literais de strin# (6'Y6 e 61(6) para mostrar que a com$inao de literais e par=metros de entrada permitida, desde que eles se&am GparecidosG com tipos.

4.,U.N - ' cl9usula EFERE e *S NU!!

; operador de comparao *S NU!! permite testar se uma expresso de interli#ao null (nula). @or exemplo, esta instruo E(%-0! seleciona todos os clientes que no t,m um endereo-

SE!EC& c FR$+ Cliente 'S c EFERE c.endereco *S NU!!

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

*tili ando o operador lVgico N$&, podemos in:erter os resultados dessa consulta, selecionando todos os clientes que tem um endereo-

SE!EC& c FR$+ Cliente 'S c EFERE c.endereco *S N$& NU!!

As express"es de interli#ao so compostas utili andoHse a sem=ntica Dinner joinD. Se uma entidade ti:er um ca po de relaciona ento null, qualquer consulta que utili a esse campo como parte de uma expresso de caminho elimina a possi$ilidade dessa entidade ser considerada. @or exemplo, se a entidade Cliente que representa 2'o$erto Santos2 ti:er um valor null para seu ca po de relaciona ento endereco, ento a entidade Cliente 2'o$erto Santos2 no ser inclu<da no con&unto de resultados desta consulta-

SE!EC& c FR$+ Cliente 'S c EFERE c.endereco.estado 1 G+^G 'N5 c.no e 1 GRobertoG 'N5 c.sobreno e 1 GSantosG

A princ<pio isso parece G$:io, mas declarHIa explicitamente a&uda a eliminar $oa parte da am$i#`idade associada aos ca pos de relaciona ento null. ; operador de co parao NU!! tam$m pode ser utili ado para testar par=metros de entrada. Aesse caso, NU!! normalmente com$inado com o operador N$& para asse#urar que um par=metro de entrada no se&a um :alor null. @or exemplo, esta consulta pode ser utili ada para testar null nos par=metros de entrada. A instruo E(%-0! primeiro :erifica os par=metros de entrada cidade e estado no so null e ento os utili a nas opera"es de comparao-

SE!EC& c FR$+ Cliente 'S c EFERE 2cidade *S N$& NU!! 'N5 2estado *S N$& NU!! 'N5 c.endereco.estado 1 2estado 'N5 c.endereco.cidade 1 2cidade

Aesse caso, se um dos par=metros de entrada ti:er um valor null, a consulta retomar um !ist (lista) :a ia, e:itando a possi$ilidade de resultados

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

UN_N$EN (desconhecidos) a partir dos par. etros de entrada null (nulos). Seu cVdigo (ava deve ?aBer esses testes de valores nulos antecipada ente a ?i de evitar u a viage de ida e volta desnecess9ria ao banco de dados.

Se os resultados de uma consulta inclu<rem um relaciona ento ou u ca po b9sico null, esses resultados de:ero incluir valores null. @or exemplo, a consulta a se#uir seleciona os endereos dos clientes cu&o so$renome Santos-

SE!EC& c.endereco.cidade FR$+ Cliente 'S c EFERE c.sobreno e 1 GSantosG

Se a entidade Cliente que representa 2'o$erto Santos2 ti:er um :alor null para seu ca po de relaciona ento endereco, a consulta anterior retomar uma !ist que inclui um valor null6 que representa o ca po de relaciona ento endereco de 2'o$erto Santos2, alm de al#umas outras refer,ncias W entidade Endereco. +oc, pode eliminar valores null (nulos) incluindo o operador N$& NU!! na consulta, como mostrado aqui-

SE!EC& c.endereco.cidade FR$+ Cliente 'S c EFERE c.endereco.cidade N$& NU!! 'N5 c.endereco.estado 1 G+^G 4.,U.S - ' cl9usula EFERE e *S E+)&Q

; operador *S E+)&Q permite que a consulta teste se um relacionamento $aseado em coleo est :a io. 3em$reHse, conforme discutido anteriormente, de que u relaciona ento baseado e coleo nunca ser9 null. Se um campo de relacionamento $aseado em coleo no ti:er nenhum elemento, ele retomar um Collection ou set :a io. 4estar se um relacionamento $aseado em coleo est :a io tem o mesmo propGsito de testar se um nico campo de relacionamento ou campo $sico null - ele pode ser utili ado para limitar o escopo da consulta e dos itens selecionados. @or exemplo, esta consulta seleciona todos os cru eiros que no fi eram nenhuma reser:a-

SE!EC& crs FR$+ CruBeiro 'S crs EFERE crs.reservas *S E+)&Q

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

o operador N$& in:erte o resultado do *S E+)&Q. A consulta a se#uir seleciona todos os cru eiros que t,m pelo menos uma reser:a-

SE!EC& crs FR$+ CruBeiro 'S crs EFERE crs.reservas *S N$& E+)&Q F ile#al usar *S E+)&Q contra relacionamentos $aseados em coleo aos quais foram atri$u<dos um identificador na cl9usula FR$+TT consulta ile#al SE!EC& r FR$+ Reserva 'S r *NNER ($*N r.clientes 'S c EFERE r.clientes *S N$& E+)&Q 'N5 c.endereco.cidade 1 GRio de (aneiroG

Em$ora essa consulta parea ser uma $oa direti:a contra resultados UN_N$EN (desconhecidos), ela no . Essa consulta ile#al, porque o operador *S E+)&Q no pode ser utili ado em um relacionamento $aseado em coleo identificado dentro de uma *NNER ($*N. !omo o relacionamento especificado na cl9usula *NNER ($*N, somente aquelas entidades Reserva que t,m um ca po c>a ado clientes no vaBio sero inclu<das na consulta9 qualquer entidade Reserva que tem um campo de relacionamento :a io exclu<da, porque no poss<:el atri$uir ao seu elemento clientes o identi?icador c.

4.,U.M - ' cl9usula EFERE e +E+%ER $F

o operador +E+%ER $F uma ferramenta poderosa para determinar se uma entidade mem$ro de um relacionamento espec<fico $aseado em coleo. A consulta a se#uir selecionar todos os cru eiros em que o cliente especificado tem uma reser:a-

SE!EC& crs FR$+ CruBeiro 'S crs6 *N "crs.reservas# 'S res6 Cliente 'S cli EFERE cli1 euCliente 'N5 cli +E+%ER $F res.clientes

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Aplicar o operador N$& a +E+%ER $F tem o efeito in:erso, ou se&a, de selecionar todos os cru eiros em que o cliente especificado no tem uma reser:a-

SE!EC& crs FR$+ CruBeiro 'S crs6 *N "crs.reservas# 'S res6 Cliente 'S cli EFERE cli 1 2 euCliente 'N5 cli N$& +E+%ER $F res.clientes

+erificar se uma entidade mem$ro de uma coleo :a ia sempre retorna true.

4.,U.,U - ' cl9usula EFERE e !*_E

o operador de co parao !*_E permite que a consulta selecione campos do tipo String que correspondem a um padro especificado. @or exemplo, esta instruo E(%-0! seleciona todos os clientes com so$renomes hifeni ados, como 21onsonH%aefel2 e 2ZernersH3ee2-

SE!EC& c FR$+ Cliente 'S c EFERE c.sobeno e !*_E G`-`G

+oc, pode utili ar dois caracteres especiais ao esta$elecer um padro de comparao- ` (por cento) si#nifica qualquer sequencia de caracteres e a "sublin>ado# si#nifica qualquer caractere nico. +oc, pode utili ar esses caracteres em qualquer locali ao dentro de um padro de string. Se um g ou ^ realmente ocorrer na string, :oc, pode contornHlos com o caractere b. ; operador lVgico N$& in:erte a a:aliao, para que padr"es de correspond,ncia se&am exclu<dos. ;s exemplos a se#uir mostram como a cl9usula !*_E a:alia campos do tipo String-

tele?one.nu ero !*_E GK,N`G +erdadeiro para 2PSQHNEEHdSOS2 Malso para 2dSOHEEEHNOEN2 cabine.no e !*_E GSuite a,UUG +erdadeiro para 2Suite ASRR2 Malso para 7Suite AENNV

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

tele?one.nu ero N$& !*_E GKUS`G +erdadeiro para 2dSOHEEEHNOEN2 Malso para 2PRbHENNHbdbd2 algu Ca po.sublin>ado !*_E Gba`G +erdadeiro para 2^x/ 2 Malso para 7a$cV algu Ca po.porcentage !*_E Gb``G +erdadeiro para 2 g ][h2 Malso para 2AZ!2 ; operador 3I\E tam$m pode ser utili ado com par=metros de entradaSE!EC& c FR$+ Cliente 'S c EFERE c.sobreno e !*_E 2para etro 4.,, - ExpressIes ?uncionais

A E(%-0! tem di:ersas fun"es que :oc, pode utili ar para processar strin#s e :alores numricos

4.,,., - ExpressIes ?uncionais na cl9usula EFERE

A E(%-0! tem sete express"es funcionais que permitem a manipulao de Strin#s simples e tr,s express"es funcionais para opera"es numricas $sicas. As fun"es para manipulao de Strin#s so-

!$EER"String# !on:erte uma strin# em letras minsculas. U))ER"String# !on:erte uma strin# em letras maisculas . &R*+"H!E'5*N^ Z &R'*!*N^ Z %$&F/ Htri ac>ar/ FR$+/ String# @ermite remo:er um caractere especificado do in<cio (3EAKIA(), fim (4'AI3IA() ou am$os (Z;4%). Se :oc, no especificar um caractere de remoo, assumeHse o caractere de espao em $ranco.

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

C$NC'&"Stringl6 String4# 'etorna a Strin# que resulta da concatenao de Strin#l e Strin#E. !EN^&F"String# 'etorna um int indicando o comprimento da strin#. !$C'&E"String,6 String4 Hstart/# 'etoma um int indicando a posio em que String, est locali ado dentro de String4. Se esti:er presente, start indica a posio de caractere na Strin#E em que a pesquisa de:e iniciar. ; suporte ao par. etro start opcional9 al#uns cont,iners :o suportHlo e outros no. Ao o utili e se quiser asse#urar que a consulta se&a port:el. SU%S&R*N^"String,6 inicio6 ta an>o# 'etoma a String que consiste no nmero de caracteres (tamanho) selecionados da String,, iniciando na posio dada por inicio. ;s par. etros inicio e ta an>o indicam posi"es em uma String como :alores de inteiro. +oc, pode utili ar essas express"es na cl9usula EFERE para refinar o escopo dos itens selecionados. Eis como as fun"es !$C'&E e !EN^&F podem ser utili adasSE!EC& c FR$+ Cliente 'S c EFERE !EN^&F"c.sobreno e# X K 'N5 !$C'&E" c.sobreno e6 G+onsonG# X -,

Essa instruo seleciona todos os clientes com 1onson em al#um lu#ar nos seus so$renomes, mas especifica que os nomes de:em ter um comprimento maior que seis caracteres. @ortanto, 21onsonH%aefel2 e 21onsonHAres2 seriam a:aliados para true, mas 21onson2 retornaria false porque ele tem apenas seis caracteres. As fun"es aritmticas na E(%-0! podem ser aplicadas aos tipos primiti:os e classes empacotadoras-

'%S"nu ber#

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

'etoma o :alor a$soluto de um nmero (int, float ou dou$le) S0R&"double# 'etoma a rai quadrada de um double +$5"int6 int# 'etoma o resto do primeiro par=metro di:idido pelo se#undo (exemplo- 1;K (Q,O) i#ual a E) 4.,4 - FunIes que reto a

datas e >oras

A E(%-0! tem tr,s fun"es que podem retomar a data, a hora e um re#istro de dataThora atuaisCURREN&a5'&E, CURREN&a&*+E e CURREN&a&*+ES&'+). Eis um exemplo da procura das reser:as feitas na data atual-

SE!EC& res FR$+ Reserva res EFERE res.data 1 CURREN&a5'&E 4.,8 - FunIes agregadas na cl9usula SE!EC&

As fun"es a#re#adas so utili adas com consultas que retomam uma coleo de :alores. Elas so relati:amente simples de entender e podem ser teis, especialmente no caso da funo C$UN&" #.

4.,8., - C$UN& "identi?icador ou expresso de interligao#

Essa funo retoma o nmero de itens no con&unto de resultados da consulta. ; tipo de retomo um java.lang.!ong, dependendo se ele for o tipo de retorno do mtodo de consulta. @or exemplo, a consulta a se#uir fornece uma conta#em de todos os clientes que residem no estado de 1inas (erais-

SE!EC& C$UN&" c # FR$+ Clientes 'S c EFERE c.endereco.estado 1 G+^G

A funo C$UN&" # pode ser utili ada com um identificador, caso em que ela sempre conta entidades, ou com express"es de caminho. @or exemplo, esta instruo fornece uma conta#em de todos os !E@ que iniciam com os nmeros OOd-

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

SE!EC& C$UN&"c.endereco.cep# FR$+ Cliente 'S c EFERE c.endereco.cep !*_E GJJ=`G

Em al#uns casos, consultas que contam uma expresso de interli#ao t,m uma consulta correspondente que pode ser utili ada para contar um identificador. @or exemplo, o resultado da consulta a se#uir, que conta clientes em :e do campo cep, equi:alente W consulta anterior-

SE!EC& C$UN&" c # FR$+ Cliente 'S c EFERE c.endereco.cep !*_E GJJ=`G 4.,8.4 - +'c "expresso de interligao#6 +*N "expresso de interligao#

Essas fun"es podem ser utili adas para locali ar o maior ou o menor :alor de uma coleo de qualquer tipo de campo. Elas no podem ser utili adas com identificadores ou interli#a"es que terminem em um campo de relacionamento. ; tipo de resultado ser o tipo do campo sendo a:aliado. @or exemplo, esta consulta retoma o preo mais alto pa#o por uma reser:a-

SE!EC& +'c" r.valor)ago # FR$+ Reserva 'S r

As ?unIes +'c" # e +*N" # podem ser aplicadas a qualquer :alor pertinente, incluindo tipos primiti:os, strin#s e at o$&etos seriali :eis. ; resultado da aplicao das funIes +'c" # e +*N" # a o$&etos seriali :eis no est especificado porque no h nenhuma maneira padro de determinar qual o$&eto seriali :el maior ou menor que um outro. ; resultado da aplicao das ?unIes +'c" # e +*N" # a um ca po String depende do arma enamento de dados su$&acente. Isso tem que :er com os pro$lemas inerentes associados Ws compara"es de tipos String.

4.,8.8 - 'T^"nu <rico#6 SU+ "nu <rico#

As ?unIes 'T^" # e SU+" # sG podem ser aplicadas a express"es de interli#ao que terminam em um campo numrico primiti:o ( byte6 long6 ?loat

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

etc.) ou em um de seus empacotadores numricos correspondentes ( %yte6 !ong6 Float, etc).

; resultado de uma consulta que utili a a ?uno SU+" # tem o mesmo tipo que o tipo numrico que ela est a:aliando. ; tipo de resultado da funo 'T^" # um java.lang.5ouble, dependendo se ela utili ada no tipo de retorno do mtodo SE!EC&. @or exemplo, a consulta a se#uir utili a a ?uno SU+" # para o$ter o :alor total pa#o por todos os clientes para um cru eiro espec<fico (especificado pelo par=metro de entrada)-

SE!EC& SU+" r.valor)ago# FR$+ CruBeiro c ($*N c.reservas r EFERE c 1 2 c 4.,= - 'rgu entos vaBios6 nulos e 5*S&*NC&

; operador 5*S&*NC& pode ser utili ado com qualquer das fun"es a#re#adas para eliminar :alores duplicados. A prGxima consulta utili a o operador 5*S&*NC& para contar o nmero de diferentes !E@s que correspondem ao padro especificado-

SE!EC& 5*S&*NC& C$UN&"c.endereco.cep# FR$+ Cliente 'S c EFERE c.endereco.cep !*_E GJJ=`G

; operador 5*S&*NC& elimina os CE)s duplicados9 se SRR clientes residirem na mesma rea com o mesmo !E@, seus !E@s so contados somente uma :e . Kepois de as duplicatas serem eliminadas, a ?uno C$UN&" # conta o nmero de itens remanescentes. .ualquer campo com um valor null automaticamente eliminado do con&unto de resultados operado pelas fun"es a#re#adas. A ?uno C$UN&" # tam$m i#nora :alores nulos. As fun"es a#re#adas 'T^" #, SU+" #, +'c" # e +*N" # retornam null ao a:aliar uma coleo :a ia. @or exemplo, esta consulta tenta o$ter o preo mdio pa#o pelos clientes por um cru eiro espec<fico-

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

SE!EC& 'T^" r.valor)ago# FR$+ CruBeiro 's c ($*N c.reservas r EFERE c 1 2 euCruBeiro Se o cru eiro especificado pelo par=metro de entrada no ti:er nenhuma reser:a, a coleo em que a funo 'T^" # opera, permanecer :a ia (no h nenhuma reser:a e, portanto, nenhum :alor pa#o).

A ?uno C$UN&" # retoma o ( ero) quando o ar#umento que ela a:alia uma coleo :a ia. Se a prGxima consulta for a:aliada em um cru eiro sem reser:as, o resultado ser o ( ero), porque o ar#umento uma coleo :a ia-

SE!EC& C$UN&" r # FR$+ CruBeiro 'S c6 *N" c.reservas # 'S r EFERE c 1 3, 4.,J - ' cl9usula $R5ER %Q

A cl9usula $R5ER %Q permite especificar a ordem das entidades na coleo retomada por uma consulta. A sem=ntica da cl9usula $R5ER %Q $asicamente a mesma da S0!. @or exemplo, podemos construir uma consulta simples que utili a a cl9usula $R5ER %Q para retomar uma lista alfa$tica de todos os clientes do 4itan !ru eiros-

SE!EC& c FR$+ Cliente 'S c $R5ER %Q c.sobreno e

Isso poderia retomar uma Collection das entidades Cliente na ordem a se#uir (sup"eHse que seus so$renomes e primeiros nomes so impressos na sa<da)-

Aares, Yohn Astro, 3inda ZrooJs, %anJ . . . ]erces, \aren hastro, Xilliam

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

+oc, pode utili ar a cl9usula $R5ER %Q com ou sem a cl9usula EFERE. @or exemplo, podemos refinar a consulta anterior, listando apenas aqueles clientes nos E*A que residem em Zoston-

SE!EC& c FR$+ Cliente 'S c EFERE c.endereco.cidade 1 G%ostonG 'N5 c.endereco.estado 1 G+'G $R5ER %Q c.sobreno e

A ordem padro de um item listado na cl9usula $R5ER %Q sempre ascendente, o que si#nifica que os menores :alores so listados primeiro e os maiores :alores por ltimo. +oc, pode especificar explicitamente a ordem como ascendente ou descendente utili ando as palavras-c>ave 'SC e 5ESC. ; padro 'SC. Elementos nulos sero colocados na parte superior ou na parte inferior do resultado da consulta dependendo do $anco de dados su$&acente. Eis uma instruo que lista os clientes na ordem in:ersa (descendente)-

SE!EC& c FR$+ Cliente 'S c $R5ER %Q c.sobreno e 5ESC ;s resultados desta consulta sohastro, Xilliam ]erces, \aren ... ... ZrooJs, %anJ Astro, 3inda Aares, Yohn

+oc, pode especificar um ordenamento de mltiplos itens. @or exemplo, :oc, pode classificar os clientes pelo so$renome na ordem ascendente e nome na ordem descendente-

SE!EC& c FR$+ Cliente 'S c

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

$R5ER %Q c.sobreno e 'sC6 c.no e 5ESC Se :oc, ti:er cinco entidades !liente com o so$renome i#ual a ZrooJs, essa consulta classificar os resultados desta maneiraZrooJs, Xilliam ZrooJs, %enr/ ZrooJs, %anJ ZrooJs, $em ZrooJs, And/

Em$ora os campos utili ados na cl9usula $R5ER %Q de:am ser campos $sicos, o :alor selecionado pode ser um identificador de entidade, um campo de relacionamento ou um campo $sico. @or exemplo, a consulta a se#uir retorna uma lista ordenada de todos os !E@s-

SE!EC& endereco.cep FR$+ Endereco 'S end $R5ER %Q end.cep

A prGxima consulta retorna todas as entidades Endereco para clientes de so$renome Smith, ordenadas pelo seu !E@-

SE!EC& c.endereco FR$+ Cliente 'S c EFERE c.sobreno e 1 GS it>G $R5ER %Q c.endereco.cep

+oc, de:e ter cuidado quanto aos campos $sicos utili ados na cl9usula $R5ER %Q. Se a consulta selecionar uma coleo de entidades, ento a cl9usula $R5ER %Q sG poder ser utili ada com campos $sicos do tipo de entidade que selecionado. A consulta a se#uir ile#al, porque o campo $sico utili ado na cl9usula $R5ER %Q no um campo do tipo de entidade selecionado-

TT EYZH.3 ile#al SE!EC& c FR$+ Cliente 'S c

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

$R5ER %Q c.endereco.cidade

!omo o ca po cidade no um campo direto da entidade Cliente, :oc, no pode utili HIa na cl9usula $R5ER %Q. *ma restrio semelhante se aplica aos resultados. ; campo utili ado na cl9usula $R5ER %Q tam$m de:e estar na cl9usula SE!EC&. A prGxima consulta ile#al, porque o campo identificado na cl9usula SE!EC& no o mesmo do utili ado na cl9usula $R5ER %Q-

77 E(%-0! ilegal SE!EC& c.endereco.cidade FR$+ Cliente 'S c $R5ER %Q c.endereco.estado

Aa consulta anterior, quer<amos uma lista de todas as cidades ordenadas por seu estado. Infeli mente, isso ile#al. +oc, no pode ordenar pelo campo estado e tam$m no pode selecionar o campo estado.

4.,K - ^R$U) %Q e F'T*N^

As cl9usulas ^R$U) %Q e F'T*N^ so comumente utili adas para aplicar uma or#ani ao mais estrita a uma consulta e estreitar os resultados para fun"es a#re#adas. A cl9usula ^R$U) %Q normalmente utili ada em com$inao com as fun"es a#re#adas, pois ela permite que :oc, a#rupe os dados por cate#oria. Ki#amos que :oc, queira #erar um relatGrio para desco$rir quantas reser:as cada cru eiro particular tinha. Seria recomend:el utili ar a ?uno C$UN& para contar cada reser:a, mas como a#ruparia o clculo da conta#em com $ase em um determinado cru eiroD F isso o que a sintaxe ^R$U) %Q lhe permite fa er. Eis uma consulta que retorna o nome do cru eiro e uma conta#em de cada reser:a em um cru eiro-

SE!EC& cr.no e6 C$UN& "res# FR$+ CruBeiro cr !EF& ($*N cr.reservas res ^$U) %Q cr.no e

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

A cl9usula ^R$U) %Q de:e especificar uma das colunas que :oc, est retornando na consulta. !omo estamos utili ando uma !EF& ($*N, cru eiros sem reser:as sero retomados com uma conta#em de ero. Se quisesse excluir cru eiros do relatGrio que no tinha nenhuma reser:a, :oc, utili aria, em :e disso, uma *NNER ($*N. A sintaxe ^R$U) %Q ainda mais interessante se a com$inarmos com uma expresso de construtor. +amos preencher uma lista das inst.ncias Resu oReserva. Resu oReserva uma classe auxiliar que contm o nome do cru eiro, nmero de reser:as e quanto foi coletado-

pu$lic class 'esumo'eser:a B pu$lic Strin# cru eiro9 pu$lic int num'eser:as9 pu$lic dou$le fluxoKinheiro9 pu$lic 'esumo'eser:a(Strin# c, int num, dou$le dinheiro) B this.cru eiro 0 c9 this.num'eser:as 0 num9 this.fluxoKinheiro 0 dinheiro9 In:ocaremos o construtor diretamente dentro de nossa consultaSE!EC& ne: Resu oReserva"cr.no e6 C$UN&"res#6 SU+"res.valor)ago## FR$+ CruBeiro cr !EF& ($*N cr.reservas res ^R$U) %Q cr.no e

A cl9usula F'T*N^ utili ada com uma cl9usula ^R$U) %Q e a#e como um filtro, restrin#indo o resultado final. A cl9usula F'T*N^ usa express"es funcionais a#re#adas empre#ando apenas os identificadores utili ados na cl9usula SE!EC&. +oc, pode restrin#ir o resultado ^R$U) %Q utili ando a sintaxe F'T*N^. +amos restrin#ir nosso relatGrio para que ele mostre apenas aqueles cru eiros com mais de SR reser:as-

SE!EC& cr.no e6 C$UN& "res# FR$+ CruBeiro cr ($*N cr.reservas res ^R$U) %Q cr.no e

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

F'T*N^ count"res# X ,U As mesmas re#ras que #o:ernam as cl9usulas SE!EC& #o:ernam as cl9usulas F'T*N^. Somente propriedades a#rupadas podem, porm, aparecer fora de qualquer funo que :oc, utili a. 4.,N - Subconsultas

Su$consultas so instruIes SE!EC& em$utidas em uma outra consulta. A E(%-0! suporta su$consultas nas cl9usulas EFERE e F'T*N^. Su$consultas so muito teis quando mecanismos normais para estreitar sua pesquisa no podem o$ter os dados que :oc, dese&a. Eis um exemplo de como encontrar a conta#em de todas as reser:as cu&o :alor pa#o maior que o :alor mdio pa#o por todas as reser:as-

SE!EC& C$UN&"res# FR$+ Reserva res EFERE res.valor)ago X "SE!EC& avg"r.valor)ago# FR$+ Reserva r#

Se examinar cuidadosamente, :oc, poder :er que esse exemplo na :erdade pode ser di:idido em duas consultas separadas. +oc, poderia executar uma consulta que encontrasse o :alor mdio pa#o e ento passar esse :alor para a se#unda consulta a fim de locali ar todos os :alores pa#os que so maiores que a mdia. @ara ra "es de desempenho, melhor su$meter uma consulta, uma :e que poss<:el e:itar os tempos adicionais #astos com uma chamada de rede extra ao $anco de dados. 4am$m poss<:el que o $anco de dados otimi e essa consulta #rande. +oc, tam$m pode referenciar identificadores na cl9usula FR$+ da consulta externa de sua su$consulta. @or exemplo, supondo que queiramos locali ar todos os cru eiros que faturaram mais de 'f SRR.RRR. A consulta se pareceria com isto-

SE!EC& cr FR$+ CruBeiro cr EFERE ,UUUUU \ "SE!EC& SU+"res.valor)ago# FR$+ cr.reservas res#

A su$consulta, nesse exemplo, referencia a associao da reser:a do cru eiro especificado na clusula FR$+ da consulta externa.

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

4.,N., - 'll6 'NQ6 S$+E

.uando uma su$consulta retorna mltiplas linhas, poss<:el quantificar os resultados com as expressIes '!!, 'NQ e S$+E. ; operador '!! retorna true se todas as coisas na su$consulta corresponderem W expresso condicional. @or exemplo, tal:e fosse necessrio listar os cru eiros em que cada reser:a tenha um pa#amento de entrada-

SE!EC& FR$+ CruBeiro cr EFERE U \ '!! " SE!EC& res.valor)ago FR$+ cr.reservas res#

; operador 'NQ retoma true se qualquer coisa na su$consulta corresponde W expresso condicional. @or exemplo, tal:e tenha sido necessrio locali ar todos os cru eiros com pelo menos uma reser:a sem um pa#amento de entrada-

SE!EC& FR$+ CruBeiro cr EFERE U 1 'NQ "SE!EC& res.valor)ago FR$+ cr.reservas res#; S$+E um sininimo de 'NQ, e as duas so sintaticamente equi:alentes. +oc, pode utili ar uma expresso A;4 para o$ter mesma consultaSE!EC& FR$+ CruBeiro cr EFERE $ \ N$& '!! "SE!EC& res.valor)ago FR$+ cr.reservas res# 4.,N.4 - Ec*S&S ; operador Ec*S&S retoma true se o resultado da su$consulta consistir em um ou mais :alores. Se nenhum :alor retornado pela su$consulta, ento ?alse ser retornado. @od<amos reescre:er nossa consulta para pesquisar cru eiros em que al#uns clientes ainda no pa#aram suas contasSE!EC& FR$+ CruBeiro cr EFERE Ec*S&S "SE!EC& res FR$+ cr.reservas EFERE res.valor)ago 1 U#

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

4.,S - U)5'&E e 5E!E&E e

lote

A (ava )ersistence tem a capacidade de reali ar operaIes U)5'&E e 5E!E&E em lote. Isso pode poupar uma #rande quantidade de di#itao. @or exemplo, di#amos que se&a necessrio dar um crdito de *Sf SR a todos os clientes chamados %ill %ur@e. @odemos reali ar esta operao U)5'&E em lote-

U)5'&E Reserva res SE& res.valor)ago 1 "res.valor)ago R ,U# EFERE Ec*S&S " SE!EC& c FR$+ res.clientes c EFERE c.no e 1 G%illG 'N5 c.sobreno e1G%ur@eG # *m exemplo de 5E!E&E poderia ser para remo:er todas as reser:as feitas por %ill %ur@e5E!E&E FR$+ Reserva res EFERE Ec*S&S " SE!EC& c FR$+ res.clientes c EFERE c.no e 1 G%illG 'N5 c.sobreno e1G%ur@eG 4enha muito cuidado quanto W maneira como :oc, utili a U)5'&E e 5E!E&E em lote. F poss<:el, dependendo da implementao do fornecedor, criar inconsist,ncias entre o $anco de dados e as entidades que & esto sendo #erenciadas pelo contexto de persist,ncia atual. Implementa"es de fornecedor precisam apenas executar a atuali ao ou excluso diretamente so$re o $anco de dados. Elas no t,m de modificar o estado de nenhuma entidade #erenciada. @or essa ra o, recomend:el que :oc, reali e essas opera"es dentro das transa"es prGprias ou no comeo de uma transao (antes que quaisquer entidades se&am acessadas que tal:e se&am afetadas por essas opera"es em lote). !omo alternati:a, executar Entity+anager.?lus>" # e Entity+anager.clear" # antes de executar u a operao e lote o anter9 seguro. 4.,M - Consultas nativas

A E(%-0! uma sintaxe muito rica e de:e satisfa er a maioria de suas necessidades de consulta. Ls :e es, porm, :oc, quer tirar pro:eito de certas

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

capacidades proprietrias sG dispon<:eis em um fornecedor de $anco de dados espec<fico.

; ser:io do #erenciador de entidade fornece uma maneira de criar consultas S0! nativas e mapeHlas para o$&etos. As consultas nati:as podem retornar entidades, :alores de coluna ou uma com$inao desses dois. A inter?ace Entity+anager tem tr,s mtodos para criar consultas nati:as- uma para retornar :alores escalares, uma para retornar um tipo de entidade e uma para definir um con&unto de resultados complexos que podem ser mapeados para uma com$inao de mltiplas entidades e :alores escalares. +oc, sempre pode o$ter a conexo (5%C su$&acente por meio de uma javax. sql.5ataSource in&etada pelo CResource e executar qualquer instruo S0! de que :oc, precisa. Este&a ciente de que suas altera"es no sero refletidas no contexto de persist,ncia atual.

4.,M., - Consultas nativas escalares 0uery createNative0uery "String sql# Isso cria uma consulta nati:a que retorna resultados escalares. Ela rece$e um par=metro- sua S0! nativa. Ela executada como est e retorna o con&unto de resultados da mesma forma que a E(%-0! retoma :alores escalares. 4.,M.4 - Consultas nativas si ples de entidades 0uery createNative0uery "String sql6 class classeEntidade#

*ma consulta de entidade, nati:a simples, rece$e uma instruo S0! e implicitamente mapeiaHa para uma entidade $aseada nos metadados de mapeamento que :oc, declarou para essa entidade. Ela espera que as colunas retornadas no con&unto de resultados da consulta nati:a correspondero perfeitamente com o apea ento $7R da entidade. A entidade para a qual a consulta S0! nativa mapeia determinada pelo par=metro Entidade.class -

0uery consulta 1 gerenciador.createNative0uery" DSE!EC& t.nu ero6 t.tipo FR$+ &ele?one 'S tD6 &ele?one.class #;

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

4.,M.8 - Consultas nativas co plexas 0uery createNative0uery"String sql6 String no e+apea ento#

Esse mtodo do #erenciador de entidade permite mapeamentos complexos para sua S0! nativa. +oc, pode retomar mltiplas entidades e :alores escalares de coluna ao mesmo tempo. ; par=metro no e+apea ento referencia uma Cjavax.persistence.SqlResultSet+apping declarada. Essa anotao utili ada para definir a maneira como os resultados S0! nativos se encaixam ao seu odelo $7R. Se os nomes de suas colunas retornadas no corresponderem ao mapeamento paralelo da propriedade anotada, :oc, poder fornecer um mapeamento de campo para coluna a esses nomes utili ando Cjavax.persistence. FieldResult-

pacJa#e &a:ax.persistence9 pu$lic Uinterface Sql'esultSet1appin# B Strin# name( )9 Entit/'esult_) entities( ) default BC9 !olumn'esult_) columns( ) default BC9 C pu$lic Uinterface Entit/'esult B !lass entit/!lass( )9 Mield'esult_) fields( ) default BC9 Strin# discriminator!olumn( ) default 7 79 C pu$lic Uinterface Mield'esult B Strin# name ( )9 Strin# column()9 C pu$lic Uinterface !olumn'esult B Strin# name ( )9 C

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

+amos criar uma srie de exemplos para mostrar como isso funciona Lltiplas entidades

Consultas nativas co

@rimeiro, :amos criar uma consulta nati:a que retoma mltiplos tipos de entidade- um Cliente e seu Cartao

UEntit/ USql'esultSet1appin#(name02cliente1apeamento!artao2, entities0BUEntit/'esult(entit/!lass0!liente.class), UEntit/'esult(entit/!lass0!artao.class, fields0BUMield'esult(name02id2 , column02!!^ IK2), UMield'esult(name02numero2, column02numero2)C )C) pu$lic class !liente B ... C TT cGdi#o de execuo 0uery consulta 1 gerenciador.createNative0uery" DSE!EC& c.id6 c.no e6 cc.id 'S CCa*56 cc.nu eroD R DFR$+ C!*EN&E c6 C'R&'$ ccD R DEFERE c.cartao5eCredito 1 cc.idD6 Dcliente+apea entoCartaoD#;

!omo o con&unto de resultados retoma mltiplos tipos de entidade, precisamos definir uma CSqlResultSet+apping. Esta anotao pode ser colocada em uma classe de entidade ou mtodo. ; atri$uto entities" # confi#urado como uma srie de anota"es CEntityResult. !ada anotao CEntityResult especifica as entidades que sero retomadas pela consulta S0! nativa. A anotao Cjavax.persistence.FieldResult utili ada para mapear explicitamente colunas na consulta com propriedades de uma entidade. ; atributo na e" # da CFieldResult identifica a propriedade do $ean de entidade, e o atributo colu n" # identifica a coluna do con&unto de resultados retomado pela consulta nati:a.

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Aesse exemplo, no precisamos especificar nenhuma CFieldResult para Cliente, :isto que a consulta nati:a com$ina cada coluna para essa entidade. Entretanto, se sG estamos consultando as colunas de *5 e de nL ero da entidades Cartao, uma anotao CFieldResult de:e ser especificada. Aa anotao CEntityResult para Cartao, o atri$uto ?ields " # define para quais propriedades Cartao cada coluna consultada mapeada. !omo as colunas de cha:e primria Cliente e Cartao tem o mesmo nome, a consulta S.3 precisa :erificar se elas so diferentes. ; fra#mento S0! cc. id 's CCa*5 reali a essa identificao.

@odemos expressar isso tam$m em ]13>entit/Hmappin#s? >sqlHresultHsetHmappin# name02cliente1apeamento!artao2? >entit/Hresult entit/Hclass02com.titan.dominio.!liente2T? >entit/Hresult entit/Helass02com.titan.dominio.!artao2T? >fieldHresult name02id2 column02!! IK2T? >fieldHresult name02numero2 column02numero2T? >Tentit/Hresult? >TsqlHresultHsetHmappin#? >Tentit/Hmappin#s? 4.,M.= - Co binao entre entidades e valores escalares

@ara nosso exemplo final, :amos mostrar uma com$inao de uma entidade e um :alor escalar. Escre:eremos uma consulta S0! nativa que retoma uma lista dos cru eiros e quantas reser:as cada cru eiro tem.

USql'esultSet1appin#(name.2conta'eser:as2, entities.UEntit/'esult(name.2entidade.!ru eiro2, fields.UMield'esult(name.2id2, column.2id2)), columns0U!olumn'esult(name02c'eser:as2)) UEntit/ pu$lic class !ru eiro B ... C .uer/ consulta 0 #erenciador.createAati:e.uer/( 2SE3E!4 c.id, count('eser:a.id) as cReservas

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

M';1 !ru eiro c 3EM4 Y;IA 'eser:a ;A c.id 0 'eser:a.!'*hEI';^IK (';*@ Z[ c.id2, 2conta'eser:as2)9

o mapeamento contaReservas declara que a consulta S0! nati:a representa uma solicitao para uma entidade CruBeiro e uma conta#em de todas as reser:as para esse cru eiro. A anotao CFieldResult identifica a coluna c.id como estando associada a uma entidade CruBeiro. A anotao CColu nResult identifica a coluna cReservas como um :alor escalar.

4.4U - Consultas no eadas

A (ava )ersistence fornece um mecanismo para que :oc, possa predefinir consultas a E(%-0! ou S0! nativas e referenciHIas pelo nome ao criar uma consulta. d reco end9vel pr<-declarar consultas pela es a raBo que cria os vari9veis de constantes String no (ava2 para reutiliB9-*as e di?erentes situaIes. Se predefinir suas consultas em um lu#ar, :oc, ter uma maneira fcil de fa er o a&uste fino ou modificHla com o passar do tempo. A anotao Cjavax.persistence.Na ed0uery utili ada para predefinir u a consulta E(%- 0!.

pacJa#e &a:ax.persistence9 pu$lic Uinterface Aamed.uer/ B Strin# name ( )9 Strin# quer/( )9 .uer/%int_) hints( ) default BC9 C pu$lic Uinterface .uer/%int B Strin# name ( )9 Strin# :alue( )9 C pu$lic Uinterface Aamed.ueries B Aamed.uer/_) :alue( )9 C

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

*tili amos a anotao Cjavax.persistence.Na ed0ueries ao declarar mais de uma consulta em uma classe ou pacote. A anotao Cjavax.persistence.0ueryFint declara formas espec<ficas do fornecedor. Essas formas funcionam da mesma maneira como o mtodo 0uery.setFint " # descrito anteriormente. Eis um exemplo-

pacJa#e com.titan.domain9 import &a:ax.persistence.e9 UAamed.ueries(B UAamed.uer/(na e02#et1edia'eser:a2, query 0 2SE3E!4 A+(( r.:alor@a#o) M';1 !ru eiro As c, Y;IA c.reser:as r X%E'E c 0 -cru eiro2), UAamed.uer/(na e02encontrar!ru eiros@a#os2 , query02SE3E!4 M';1 !ru eiro cr X%E'E ; > A33 ( SE3E!4 res.:alor@a#o M';1 cr.reser:as.res)V) C) UEntit/ pu$lic class !ru eiro B ... C Este exemplo declara duas consultas E(%-0! no bean CruBeiro. +oc, pode ento referenciar essas declara"es no <todo createNa ed0uery" # de Entity+anager.uer/ consulta0 gerenciador.createNa ed0uery(2encontrar!ru eiros@a#os2)9 consulta.set@arameter(2cru eiro2, cru eiro)9 4.4U., - Consultas nativas identi?icadas A anotao Cjavax.persistence.Na edNative0uery utili ada para predefinir consultas S.3 nati:aspacJa#e &a:ax.persistence9 pu$lic Uinterface AamedAati:e.uer/ B Strin# name( )9 Strin# quer/ ( )9 !lass result!lass( ) default :oid.class9

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Strin# resultSet1appin#( ) default 229 C Uinterface AamedAati:e;ueries B AamedAati:e.uer/_) :alue( )9 C

; atributo resultClass" # usado quando h uma consulta nati:a que retoma apenas um tipo de entidade (:e&a a seo consultas nati:as2 anteriormente). ; atributo resultSet+apping" # de:e recorrer a um CSqlResultSet+apping prHdeclarado. Esses dois atri$utos so opcionais, mas :oc, precisar declarar pelo menos um deles. Eis um exemplo de como declarar uma CNa edNative0uery-

UAamedAati:e.uer/( name0Vencontrar!lienteE!artaoV, quer/02SE3E!4 c.id, c.nome, c.so$renome, cc.numero AS cc M';1 !liente c, !artao cc X%E'E c.cartaoKe!redito 0 cc.id2, resultSet1appin#02clienteE!!Aum1appin#2) USql'esultSet1appin#(name02clienteE!!Aum1appin#2, entities0BUEntit/'esult(entit/!lass0!liente.class)C, coSumns0BU!olumn'esult(name02!!^A*12)C ) UEntit/ pu$lic class !liente B ... C

+oc, ento pode referenciar essa declarao no mtodo createNa ed0uery" # de Entity+anager2

0uery consulta1 gerenciador.createNa ed0uery"DencontraClienteECartaoD#;

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Exerc[cios Exerc[cio , O Criando a base de testes para as consultas Aeste exerc<cio criaremos uma classe que ficar respons:el pela criao de uma $ase de testes para utili armos nos prGximos exerc<cios. ; exemplo a$aixo persiste di:ersos clientes e seus respecti:os endereos. !omplete este cGdi#o de forma a criar uma $ase de testes para todas as ta$elas relacionadas W Cliente "o diagra a de classes e6 sua i ple entao6 so os es os utiliBados e desenvolvidos e exerc[cios anteriores - siste a de reservas e cruBeiros#. ApGs executada este arqui:o, consulte o estado das ta$elas em seu $anco de dados. *tili e a camada de persist,ncia criada anteriormente para o desen:ol:imento deste exerc<cio.
pu$lic class !riaZase4estes B pu$lic static :oid main(Strin#_) ar#s) B Endereco eS 0 ne5 Endereco(2'ua sem sa<da S2, SO, 22, 2So Yudas2, 2Zaependi2, 2NNdRRHaRR2)9 Endereco eE 0 ne5 Endereco(2A:. !amilo Soares2, SON, 22, 2!entro2, 2!axam$u2, 2NSRRRHaRR2)9 Endereco eN 0 ne5 Endereco(2A+. Q de setem$ro2, EdP, 2Ap SdNE2, 2!entro2, 2Ki:inGpolis2, 2SOaRRHSRR2)9 Endereco ed 0 ne5 Endereco(2A:. @adre Au#usto2, EdOa, 22, 2;$ser:atGrio2, 2Zom espacho2, 2ENdOQHENd2)9 Endereco eO 0 ne5 Endereco(2'ua sem sa<da O2, SE, 22, 2@lanalto2, 2Itana2, 2SEQbaHabO2)9 Endereco eP 0 ne5 Endereco(2'ua sem sa<da P2, Nd, 22, 2Zom @astor2, 2Zelo %ori onte2, 2dbaRQHaNP2)9 Endereco eQ 0 ne5 Endereco(2'ua sem sa<da Q2, ENd, 22, 2centro2, 2Yui de Mora2, 2SSSSSHRRR2)9 Endereco eb 0 ne5 Endereco(2'ua @aran2, OPQb, 22, 2Santa 'ita2, 2;uro @reto2, 2EdOPQbHENd2)9 !liente a 0 ne5 !liente(2'odri#o2, 21artins @a#liares2, eS)9 !liente $ 0 ne5 !liente(2Mlorentino2, 2Ari a2, eE)9 !liente c 0 ne5 !liente(2(re#or2, 2Samsa2, eN)9 !liente d 0 ne5 !liente(2'odri#o2, 21artins @a#liares2, ed)9 !liente e 0 ne5 !liente(2Mermina2, 2Ka a2, eO)9 !liente f 0 ne5 !liente(2Andr2, 2ZolJonsi2, eP)9 !liente # 0 ne5 !liente(2@edro2, 2Zer uJo:2, eQ)9 !liente h 0 ne5 !liente(2Aicolau2, 2'osto:2, eb)9 KA;(enerico.cadastrar(a)9 KA;(enerico.cadastrar($)9 KA;(enerico.cadastrar(c)9 KA;(enerico.cadastrar(d)9 KA;(enerico.cadastrar(e)9 KA;(enerico.cadastrar(f)9 KA;(enerico.cadastrar(#)9 KA;(enerico.cadastrar(h)9 C C

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Exerc[cio 4 O &reinando as trAs ?or as de se executar u a consulta co inter?ace 0uery

@ara exemplificar, utili aremos uma mesma consulta sendo reali ada com tr,s formas distintas com a inter?ace 0uery Consulta 2 Exi$ir um relatGrio contendo os dados todos clientes, com seus respecti:os endereos, da &itan CruBeiros. Consulta S0!2 SE3E!4 e M';1 !liente, Endereco 5here !liente.idEndereco 0 Endereco.id Consulta E(%-0!2 SE3E!4 c M';1 !liente c For a , O UtiliBando E(%-0! dina ica ente co o Entity+anager <todo create0uery"# de

!ertifiqueHse de rodar o cGdi#o de criao da $ase de testes do exerc<cio anterior antes de tentar rodar o arqui:o &estaConsultas a$aixo
pu$lic class 4esta!onsultasEYZ.3 B pu$lic static :oid main(Strin#_) ar#s) B Entit/1ana#erMactor/ fa$rica 0 @ersistence.createEntit/1ana#erMactor/(2pooE@*2)9 Entit/1ana#er #erenciador 0 fa$rica.createEntit/1ana#er()9 .uer/ consulta 0 #erenciador.create.uer/(2SE3E!4 c M';1 !liente c2)9 3ist>!liente? lista 0 (3ist>!liente?)consulta.#et'esult3ist()9 for (!liente o - lista) B S/stem.out.println(o 8 o.#etEndereco().toStrin#())9 C C C

Eis uma poss<:el forma de exi$io do relatGrio -

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Kados do cliente id....- S nome.- 'odri#o so$renome..- 1artins @a#liares Kados do endereo id...- S rua..-'ua sem sa<da S complemento..numero...- So Yudas cidade...- Zaependi cep......- NNdRRHaRR Kados do cliente id....- E nome.- Mlorentino so$renome..- Ari a Kados do endereo id...- E rua..-A:. !amilo Soares complemento..numero...- !entro cidade...- !axam$u cep......- NSRRRHaRR

Kados do cliente id....- N nome.- (re#or so$renome..- Samsa Kados do endereo id...- N rua..-A+. Q de setem$ro complemento..- Ap SdNE numero...- !entro cidade...- Ki:inGpolis cep......- SOaRRHSRR Kados do cliente id....- d nome.- 'odri#o so$renome..- 1artins @a#liares Kados do endereo id...- d rua..-A:. @adre Au#usto complemento..-

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

numero...- ;$ser:atGrio cidade...- Zom espacho cep......- ENdOQHENd Kados do cliente id....- O nome.- Mermina so$renome..- Ka a Kados do endereo id...- O rua..-'ua sem sa<da O complemento..numero...- @lanalto cidade...- Itana cep......- SEQbaHabO Kados do cliente id....- P nome.- Andr so$renome..- ZolJonsi Kados do endereo id...- P rua..-'ua sem sa<da P complemento..numero...- Zom @astor cidade...- Zelo %ori onte cep......- dbaRQHaNP Kados do cliente id....- Q nome.- @edro so$renome..- Zer uJo: Kados do endereo id...- Q rua..-'ua sem sa<da Q complemento..numero...- centro cidade...- Yui de Mora cep......- SSSSSHRRR Kados do cliente id....- b nome.- Aicolau so$renome..- 'osto:

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

Kados do endereo id...- b rua..-'ua @aran complemento..numero...- Santa 'ita cidade...- ;uro @reto cep......- EdOPQbHENd

For a 4 O UtiliBando S0! dina ica ente co o Entity+anager

<todo createNative0uery"# de

+amos a#ora utili ar uma consulta S0! tradicional e #erar nosso relatGriopu$lic class 4esta!onsultasAati:as B pu$lic static :oid main(Strin#_) ar#s) B Entit/1ana#erMactor/ fa$rica 0 @ersistence.createEntit/1ana#erMactor/(2pooE@*2)9 Entit/1ana#er #erenciador 0 fa$rica.createEntit/1ana#er()9 .uer/ consulta 0 #erenciador.createAati:e.uer/(2 SE3E!4 e 2 8 2M';1 !3IEA4E, EAKE'E!; 2 8 2X%E'E !3IEA4E.IK^EAKE'E!; 0 EAKE'E!;.IK 2)9 3ist>;$&ect? lista 0 (3ist>;$&ect?) consulta.#et'esult3ist()9 for (;$&ect o - lista) B S/stem.out.println(o)9 C C C

Eis a sa<da #erada por este exemplo_S, 'odri#o, 1artins @a#liares, null, S, S, SO, So Yudas, , Zaependi, 'ua sem sa<da S, NNdRRHaRR) _E, Mlorentino, Ari a, null, E, E, SON, !entro, , !axam$u, A:. !amilo Soares, NSRRRHaRR) _N, (re#or, Samsa, null, N, N, EdP, !entro, Ap SdNE, Ki:inGpolis, A+. Q de setem$ro, SOaRRHSRR) _d, 'odri#o, 1artins @a#liares, null, d, d, EdOa, ;$ser:atGrio, , Zom espacho, A:. @adre Au#usto, ENdOQHENd) _O, Mermina, Ka a, null, O, O, SE, @lanalto, , Itana, 'ua sem sa<da O, SEQbaHabO) _P, Andr, ZolJonsi, null, P, P, Nd, Zom @astor, , Zelo %ori onte, 'ua sem sa<da P, dbaRQHaNP) _Q, @edro, Zer uJo:, null, Q, Q, ENd, centro, , Yui de Mora, 'ua sem sa<da Q, SSSSSHRRR) _b, Aicolau, 'osto:, null, b, b, OPQb, Santa 'ita, , ;uro @reto, 'ua @aran, EdOPQbHENd)

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

For a 8 O Criando u a consulta no eada"Na ed0uery# co

E(%-0!

+amos :erificar a#ora como utili ar o conceito de consultas no eadas. @ara isso, atuali e o bean de entidade Cliente com o cGdi#o a$aixo em a ul.
UEntit/ UAamed.uer/(name02relatorio!lientes2, quer/02SE3E!4 c from !liente c2) pu$lic class !liente implements Seriali a$le B pri:ate static final lon# serial+ersion*IK 0 S39 pri:ate Inte#er id9 pri:ate Strin# nome9 pri:ate Strin# so$renome9 pri:ate Endereco endereco9 pri:ate !artao cartaoKe!redito9 pu$lic !liente() B C pu$lic !liente(Strin# nome, Strin# so$renome, Endereco endereco) B this.nome 0 nome9 this.so$renome 0 so$renome9 this.endereco 0 endereco9 C pu$lic :oid setId(Inte#er id) B this.id 0 id9 C UId U(enerated+alue(strate#/ 0 (eneration4/pe.A*4;) pu$lic Inte#er #etId() B return id9 C U;:erride pu$lic int hash!ode() B int hash 0 R9 hash 80 (id j0 null D id.hash!ode() - R)9 return hash9 C U;:erride pu$lic $oolean equals(;$&ect o$&ect) B TT 4;K;- Xarnin# H this method 5on6t 5orJ in the case the id fields are not set if (j(o$&ect instanceof !liente)) B return false9 C !liente other 0 (!liente) o$&ect9 if ((this.id 00 null kk other.id j0 null) ll (this.id j0 null kk jthis.id.equals(other.id))) B

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

return false9 C return true9 C U;:erride pu$lic Strin# toStrin#() B return 2mt Kados do cliente mn2 8 2id....- 2 8 id 8 2mn2 8 2nome.- 2 8 #etAome() 8 2mn2 8 2so$renome..- 2 8 so$renome 8 2mnmn29 C U;ne4o;ne(cascade0B!ascade4/pe.@E'SIS4, !ascade4/pe.'E1;+EC) pu$lic Endereco #etEndereco() B return endereco9 C pu$lic :oid setEndereco(Endereco endereco) B this.endereco 0 endereco9 C pu$lic Strin# #etSo$renome() B return so$renome9 C pu$lic :oid setSo$renome(Strin# so$renome) B this.so$renome 0 so$renome9 C U;ne4o;ne(cascade0!ascade4/pe.A33) pu$lic !artao #et!artaoKe!redito() B return cartaoKe!redito9 C

pu$lic :oid set!artaoKe!redito(!artao cartaoKe!redito) B this.cartaoKe!redito 0 cartaoKe!redito9 C pu$lic Strin# #etAome() B return nome9 C pu$lic :oid setAome(Strin# nome) B this.nome 0 nome9 C C

A#ora, crie o arqui:o a$aixo para reali ao da consulta

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

pu$lic class 4esta!onsultasAomeadas B pu$lic static :oid main(Strin#_) ar#s) B Entit/1ana#erMactor/ fa$rica 0 @ersistence.createEntit/1ana#erMactor/(2pooE@*2)9 Entit/1ana#er #erenciador 0 fa$rica.createEntit/1ana#er()9 .uer/ consulta 0 #erenciador.createAamed.uer/(2relatorio!lientes2)9 3ist>!liente? lista 0 (3ist>!liente?)consulta.#et'esult3ist()9 for (!liente o - lista) B S/stem.out.println(o 8 o.#etEndereco().toStrin#())9 C C C

A sa<da de:er ser id,ntica W do exerc<cio S Exerc[cio = O Em todos os exerc<cios de consultas acima, o mtodo main tinha uma refer,ncia a um Entity+anagerFactory e a um Entity+anager. +oc, considera esta a$orda#em flex<:el D .ue alternati:a poderia ser dada a esta soluo atra:s de nosso KA;(enricoD Exerccio 5 APENAS PARA OS ALUNOS DA PS-GRADUAO !!!! O objetivo deste exerccio implementar a camada de persistncia para o modelo de domnio (Diagrama de classes) do Sistema Integrado de Reserva Hoteleira da BayView Bed & Breakfast A soluo dever ser enviada para o professor at, no mximo duas semanas aps a realizao da ltima aula. Regras para envio da soluo: 1 Dever ser enviado a pasta do projeto confeccionado no NetBeans 2 O nome do projeto dever ser jpa+nomeAluno. Exemplo: jpaRodrigo 3 - O banco de dados no dever ser enviado, porm o nome do mesmo cadastrado no arquivo persistence.xml dever ser cursojpa 4 Irei testar abrindo diretamente o projeto no meu NetBeans. o projeto que no abrir ser considerado no entregue. Assim sendo, testem antes de enviar, a abertura

Ps-Graduao em Desenvolvimento de Sistemas para Web Disciplina: Frameworks de Persistncia de Dados para a Web

do projeto 6 As notas sero entregues na secretaria e divulgadas para os alunos no mximo em uma semana depois de finalizado o prazo de entrega dos trabalhos. Crit<rios utiliBados na correo deste exerc[cio 2 S n 1apeamento dos 'elacionamentos considerando os se#uintes itensmultiplicidade, na:e#a$ilidade(uni ou $idirecional) E n !riao do KA; para as as opera"es !'*K N n !riao de uma classe com o mtodo main para #erar a $ase de testes para todo o dia#rama de classes (pelo menos tr,s linhas por ta$ela) d n Ke:er ser criada pelo menos SR consultas utili ando EYZH.3 O n Estas consultas de:ero ser testadas em um mtodo main de uma classe principal da aplicao P n Antes do cGdi#o que executa as consultas acima, no mtodo main, de:emos incluir um comentrio com o propGsito da consulta. Exemplopu$lic static :oid main(Strin#_) ar#s) B KA;(enerico d 0 ne5 KA;!liente()9 7W Consulta ,2 Selecionar todos os dados do cliente6 incluindo seus endereos W7 .uer/ consulta 0 KA;(enerico.getEntity+anager"#.create0uery"DSE!EC& c FR$+ Cliente cD#; 3ist>!liente? lista 0 (3ist>!liente?)consulta.#et'esult3ist()9 for (!liente o - lista) B S/stem.out.println(o 8 o.#etEndereco().toStrin#())9 C 7W Consulta 42 Selecionar o nL ero de reservas para deter inado cruBeiro W7 .... .... e

SintaHse W :ontade caso prefira utili ar consultas nomeadas. 4am$m o$ser:e que este documento fornece uma srie de exemplos de consultas E(%-0! que :oc, poder estudar para reali ao deste exerc<cio. Se&a criati:o 9) Zom cGdi#o a todos jjj 'odri#o 1artins @a#liares

Vous aimerez peut-être aussi