You are on page 1of 5
JPQL (Java Persistence Query language) ‘Uma query SELECT JPQL ¢ formada pelas cléusulas SELECT e FROM (obrigatérias) e mais 4 cléusulas opcionais com o seguinte formato wal [GROUP BY ... [HAVING ...] [ORDER 5! A estrutura das queries DELETE e UPDATE é mais simples: ETE FROM... [WHERE ... As keywords JPQL sao case insensitive. Literais de string so também case insensitives. (Os nomes das entidades Java e dos campos de dados so case sensitive Exemplo: SELECT p FROM Pessoa AS p Esta query retribui todos os objetos Pessoa na base de dados. A clausula 4S é opcional Exemplo equivalente: SELECT p FROM Pessoa p A cliusula FROM declara uma ou mais varidveis query, designadas variéveis identificagao, semelhantes 4s variaveis usadas nos ciclos nas linguagens de programagao. Cada variavel query representa uma iteracdo sobre os objectos na base de dados. Uma variével query ligada a uma entidade designa-se varidvel range. Uma -varidvel range define uma iteracao sobre todos os objectos da respectiva entidade e suas classes descendentes. Ao contrario das queries em SQL onde o alias de uma tabela é opcional, o uso de varidveis de identificacto é obrigatério em JPQL. Outra diferenga relativamente a SQL & quea cliusula SELECT neste exemplo no enumera as colunas da tabela, ou usa * para seleccionar todas as colunas. Em vez disso s6 a varivel identificagao é listada para indicar que o tipo de resultado da query ¢ a entidade Pessoa, e no um conjunto de linhas. A cliusula SELECT define os resultados da query. O exemplo acima retoma todos os objectos Pessoa resultantes da iteragiio da varidvel range p, que sio todos os objectos Pessoa na base de dados. A varivel identificagao ¢ o ponto de partida para todas as expressdes query. Cada query deve ter pelo menos uma variivel identificagao definida na clausula FROM, e essa varidvel deve corresponder a um tipo de entidade. Quando a declaracao de uma variavel identificagao nao usa uma expressio path (isto , quando é um simples nome de entidade) essa varidvel é designado por variavel range. Expresses path também podem definir aliases através de variaveis identificagao, no caso de joins e subqueries. Cliusula SELECT em JPQL e Criteria API 1, SELECT em Queries JPQL A query seguinte retoma os objectos Pessoa que passam a ser geridos pelo EntityManager: oa> resultados = query.g Projecao A query seguinte retorna os nomes das pessoas como instincias String em vez dos objectos Pessoa: SELECT p.nome FROM Pessoa AS p Expressdes path, tais como p. nome, usadas para retornar um subconjunto das propriedades de uma entidade, designam-se por projeccdes. Os valores dos campos so extraidos dos objectos entidade (ou projectados a partir dos objectos entidade) para formar os resultados da query. Os resultados da query apresentada acima s4o recebidos como uma lista de Strings: ‘TypedQuery a LECT p.nome ing> reaultado: A query seguinte retorma 0 objecto Endereco de uma pessoa especificada SELECT p.endereco FROM Pe: a AS p WHERE p.nome ‘A query seguinte retorma a descrigdo do endereco de uma pessoa especificada: SELECT p.endereco.deser ¥i ROM. Pe: soa AS p WHERE p.nome A cliusula SELECT também pode definir resultados compostos: s ECT p.nome, p.endereco.descr FROM Pessca AS p A lista de resultados desta query contém elementos array de Object (Object[]), tendo. cada array o tamanho 2. 0 cédigo seguinte mostra o processamento dos resultados: ‘TypedQuery query = em.createQuery( “SELECT p.nome, p.endereco.descr FROM Pessoa AS p", Object []-class); List resultados = query. OF for (Object(] res : resultados) system.out + res[1l)s SELECT DISTINCT Queries que usam projecedo podem retornar resultados duplicados. Por exemplo, a query seguinte pode retornar a mesma Familia (de pessoas cujo nome comega por A) mais que uma vez: SELECT p.familia FROM Pessoa AS p WHER! penome LIKE "At" Resultados duplicados podem ser eliminados usando a keyword DISTINCT: 2 Ast milia FROM Pessoa AS p WHERE p.nome JOINS entre Entidades O tipo de resultado de uma query SELECT nao pode ser uma colecc@o. Deve ser um objecto de valor simples como uma instancia de uma entidade ou um tipo de campo de dados persistente. Expressdes tais como £.pessoas so ilegais (SELECT £.pessoas FROM Familia £) porque resultariam em instincias Coleco (cada ocorréncia de £.ce2sca2 é uma colecgao, nao uma instancia). Assim se queremos navegar através de uma associagao coleccao e retornar os elementos dessa colec¢ao, devemos fazer o join das duas entidades, A query seguinte retorna os abjectos Pessoa de uma familia especificada: ECT p M Familia f, Pessoa p RE £ = p.familia AND £. milia.nome = “Silva” Um join é uma query que combina resultados de miltiplas entidades. 2. SELECT em Queries Criteria ‘Uma query para objectos Java persistentes é typesafe se 0 compilador pode verificar a correcgao da sua sintaxe. JPA 2.0 introduziu a API Criteria que tem a capacidade de criar queries typesafe. A verificacao de erros em tempo de compilacio permite reduzir erros de execucHo, em contraste com as queries JPQL baseadas em strings. JPQL tem algumas limitagdes porque ¢ uma linguagem baseada em strings. Para mostrar estas limitagdes consideremos o exemplo seguinte: String jpgl = “SELECT p FROM Pe Query query - em.createguery (jp List resultado = query.getResultList ()+ ya WHERE p.idade > 20"; Este cédigo compilaré mas falharé em tempo de execugao porque tem um erro: a string da query IPQL esta sintaticamente incorrecta. A sintaxe correcta &: String jpgl = “Sl LECT p FROM Pes joa p WHERE p.idade > 20"; Uma das grandes vantagens da API Criteria é que proibe a construcio de queries, sintaticamente incorrectas. O exemplo anterior reescrito em CriteriaQuery: EntityManager =n =... CriteriaBuilder ch = on.getCriteriaBuilder()+ Criteriagquery p = cq. from(Pessoa, eq. where (cb.gt (p.get ("idade"), 20))+ TypedQuery reaultado = query. getReaultList ()7 A API criteria query fornece varias maneiras para escrever clausulas SELECT. Selecao simples A query JPQL seguinte: String jpql - “SELECT p FROM Pessoa p WHERE p.nome - ‘Manuel Silva’ Query query = em.creategu a1) 7 Pessoa resul (Pessoa) query.getSingleResult ()+ Pode ser construida como uma query criteria como segue: ass); cq. from(Pessoa.class); swhere(cb.equal (p.get (“nome”), “Manuel Silva”)); Pessoa resultado = en.createQuery (cg) .getSingleResult (); As keywords SELECT, FROM e WHERE de JPQL t8m métodos correspondentes na forma de select(), from() e where(). A classe entidade Pessoa toma o lugar do nome da entidade na invocagao de from(), ¢ o atributo nome de Pessoa também é acedido, mas método get é usado em vez do operador ponto tsado em JPQL. O interface CriteriaBuilder é obtido a partir do interface EntityManager através do método getCriteriaBuilder(). O interface CriteriaBuilder atua como uma factory para criar os varios objectos necessérios para definir a query. E usado para criar 0 objecto CriteriaQuery que contém os métodos comespondentes as cliusulas query de JPQL, e também para construir as, expressdes condicionais na clausula where O primeiro passo para definir a query ¢ criar o objecto Root retornado pelo método from(). Este objecto é equivalente a varidvel identificagio na versio JPQL e é a base para as expresses path no resto da query. O préximo passo, invocacao do método select() com o objecto Root como argumento é equivalente & clausula SELECT da versio JPQL. O iiltimo passo € a invocacio do método where() com as condigdes construidas a partir do objecto CriteriaBuilder que representam a expresso das condic¢ées usadas na clausula WHERE da versio JPQL.

You might also like