Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos...
Transcript of Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos...
![Page 1: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/1.jpg)
Hibernate: Consultas
Francisco do Nascimento
PSC - Programação de Softwares Corporativos
UNIBRATEC, outubro de 2008
![Page 2: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/2.jpg)
2
Consultas Umas das partes mais interessantes do acesso a
dados Consultas complexas podem levar um bom tempo
para serem escritas e podem ter considerável impacto na performance da aplicação
Consultas são escritas utilizando conceitos de orientação a objetos
Objetos no lugar de tabelas Propriedades no lugar de colunas
Experiência em SQL não é desprezada
![Page 3: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/3.jpg)
3
Consultas
Podem ser feitas de três maneiras Hibernate Query Language (HQL) Criteria API e Query by Example Utilizando SQL
![Page 4: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/4.jpg)
4
Consultas: Exemplos
// Através de HQLsession.createQuery("from Category c where c.name like 'Laptop%'");
// Utilizando-se Criteriasession.createCriteria(Category.class).add(
Restrictions.like("name", "Laptop%"));
// Através de SQLsession.createSQLQuery(
"select * from cad.CATEGORY where name_category like 'Laptop%'");
![Page 5: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/5.jpg)
5
Consultas
Envolve alguns passos Criar a consulta com as restrições necessárias Adicionar parâmetros à consulta Executar a consulta e recuperar o resultado
A forma de execução da consulta e obtenção dos dados pode ser configurada
![Page 6: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/6.jpg)
6
Criando a Consulta
Query query = session.createQuery("from User");
Criteria criteria = session.createCriteria(User.class);
Objetos Query e Criteria são obtidos através do Session
org.hibernate.Query org.hibernate.Criteria
![Page 7: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/7.jpg)
7
Adicionando Parâmetros à Consulta Parâmetros não devem ser adicionados na
própria String da consulta "from Item i where i.description like '" + search +
"'" Parâmetros podem ser adicionados através
de sua posição ou de seu nome
![Page 8: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/8.jpg)
8
Adicionando Parâmetros pelo Nome
String queryString = "from Item item where item.description like :search";
Query q = session.createQuery(queryString).setString("search",searchString);
String queryString = "from Item item"+ " where item.description like :search"+ " and item.date > :minDate";
Query q = session.createQuery(queryString).setString("search",searchString).setDate("minDate", mDate);
Nome do parâmetro é precedido de “:” O valores são adicionados através de
métodos sets
![Page 9: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/9.jpg)
9
Adicionando Parâmetros pela Posição
String queryString = "from Item item"+ " where item.description like ?" + " and item.date > ?";
Query q = session.createQuery(queryString).setString(0, searchString).setDate(1, minDate);
A consulta contém “?” para indicar a existência de alguma parâmetro
Os valores também são adicionado através de métodos sets
![Page 10: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/10.jpg)
10
Executando a Consulta Se mais de um objeto pode ser retornado,
chama-se o método list() List list = query.list();
Se somente um objeto pode ser retornado, chama-se o método uniqueResult()
User user = (User) query.uniqueResult(); O método retorna null se nenhum objeto for
encontrado Se a consulta retornar mais de um objetos, a
exceção NonUniqueResultException é lançada
![Page 11: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/11.jpg)
11
Executando a Consulta
Query query = session.createQuery("from User");List<User> list = query.list();
for (User user : list) {System.out.println(user.getName());
}
Query query2 = session.createQuery("from User user where user.name =:name").setString("name","SUNSP");
User user = (User) query2.uniqueResult();
System.out.println(user.getName());
![Page 12: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/12.jpg)
12
Consultas Básicas A consulta mais simples tem somente a
cláusula FROM “from Item”
Para se referenciar as propriedades de uma entidade, um ALIAS deve ser criado
“from Item as item” “from Item item”
Palavra chave “as” é opcional
A consulta não é case-sensitive “FROM Item AS item” também pode ser utilizada
![Page 13: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/13.jpg)
13
Consultas Polimórficas Consultas podem ser escritas utilizando
polimorfismo “from Pessoa”
Retorna todas as entidades que herdam de Pessoa
Aluno Professor
![Page 14: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/14.jpg)
14
Restrições
Geralmente não se quer trazer todo o conteúdo da tabela
Restrições devem ser adicionadas para restringir os objetos retornados
HQL também utiliza-se a cláusula WHERE As restrições são feitas sobre propriedades
da entidade
![Page 15: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/15.jpg)
15
Restrições Literais e condições podem ser incluídos
Utiliza-se aspas simples para literais do tipo String “from Usuario u where u.email = '[email protected]'” “from Item i where i.ativo = true”
Comparações podem ser realizadas “from Produto p where p.quantidade between 1 and 10” “from Produto p where p.quantidade > 100” “from Usuario u where u.email in ('foo@bar', 'bar@foo')”
![Page 16: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/16.jpg)
16
Operador LIKE pode ser utilizado “%” representa qualquer seqüência de caracteres _ (Under_Score) representa qualquer caractere “from Usuario u where u.nome like 'G%'” Negação pode ser utilizada
“from Usuario u where u.nome not like '%Foo B%'”
Operadores lógicos e parênteses “from Usuario user where user.nome like 'G%'
and user.sobrenome like 'K%'”
Comparações
![Page 17: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/17.jpg)
17
Comparações
Operadores lógicos e parênteses “from Usuario u where (u.nome like 'G%' and
u.sobrenome like 'K%' ) or u.email in ('[email protected]', '[email protected]' )”
Coleções "from Venda d where d.itens is not empty"
![Page 18: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/18.jpg)
18
Comparações Funções podem ser chamadas a partir do HQL
HQL permite a chamada de funções SQL na cláusula WHERE
Funções podem ser definidas pelo usuário Depende do suporte do banco de dados
Funções UPPER() e LOWER() "from Usuario u where lower(u.email) =
'[email protected]'" Função SIZE()
from Venda v where size(v.itens) > 3 E muitas outras...
![Page 19: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/19.jpg)
19
Comparações Outras funções
CONCAT(s1, s2) SUBSTRING(s, offset, length)
Offset começa a partir de 1 TRIM( [[BOTH|LEADING|TRAILING] s)
"from Item i where TRIM(BOTH i.name) = 'Computador'" LENGTH(s) LOCATE(search, s, offset)
Procura a localização de uma substring dentro de uma string
![Page 20: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/20.jpg)
20
Comparações
Outras funções CURRENT_DATE(), CURRENT_TIME(),
CURRENT_TIMESTAMP() Valores retornados são referentes ao SGBD
SECOND(d), MINUTE(d), HOUR(d), DAY(d), MONTH(d), YEAR(d)
Extraem os valores de um argumento temporal
![Page 21: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/21.jpg)
21
Ordenando o Resultado A Cláusula ORDER BY é utilizada para ordenar o
resultado "from Usuario u order by u.nome"
Ordem ascendente ou descendente Utiliza-se asc ou desc from Usuario u order by u.login desc
Ordenando por mais de uma propriedade “from Usuario u order by u.sobrenome asc, u.nome asc”
![Page 22: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/22.jpg)
22
Junções
A habilidade de realizar junções é uma das principais forças do modelo relacional
Permite selecionar diferentes objetos associados e coleções em uma única consulta
![Page 23: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/23.jpg)
23
Inner Join
Contém somente os registros que estão relacionados com o outro lado da junção
Contém somente os Itens que possuem Bids
![Page 24: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/24.jpg)
24
(left) Outer Join
Retorna todos os Itens Dados de Bid são preenchidos com NULL se não
houver uma correspondência
![Page 25: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/25.jpg)
25
Junção com HQL Coluna de junção não precisar ser informada na
consulta Informação é extraída do mapeamento
É necessário ser informado somente o nome da associação
Nome do atributo que referencia a classe ou coleção de classes
Joins podem ser executados de duas maneiras Join implícitos na Associação Join especificado na cláusula FROM
![Page 26: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/26.jpg)
26
Join Implícito na Associação
O Join é realizado através da associação entre duas entidades
Exemplo: “from Bid bid where bid.item.description like '%Foo%'” Bid é associado a Item através do atributo “item” Hibernate sabe que a associação está mapeada a partir
da chave estrangeira ITEM_ID da tabela BID Joins implícitos são sempre realizados através de
associações many-to-one ou one-to-one
![Page 27: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/27.jpg)
27
Join Implícito na Associação
Múltiplos joins são possíveis from Bid bid where bid.item.category.name like
'Laptop%'
![Page 28: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/28.jpg)
28
Join especificado na Cláusula FROM Joins podem ser especificados explicitamente na
cláusula FROM Exemplo
"select i from Item i join i.bids b where b.amount > 10" Aliases devem ser especificados na cláusula FROM
e utilizados na cláusula WHERE Cláusula SELECT é utilizada para que somente
Itens sejam retornados
![Page 29: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/29.jpg)
29
Join especificado na Cláusula FROM Na consulta, um Item pode ser retornado
mais de uma vez Uma para cada Bid associado Somente uma instância é utilizada
A consulta possui o mesmo formato para associações many-to-one e one-to-one
![Page 30: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/30.jpg)
30
Outer Joins
Para a utilização de Outer Joins utiliza-se a cláusula LEFT JOIN
LEFT OUTER JOIN e RIGHT OUTER JOIN também podem ser utilizados
A cláusula WITH é utilizada para adicionar restrições "select i from Item i left join i.bids b with b.amount >=
9" Itens que não possuem Bids também são retornados
![Page 31: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/31.jpg)
31
Comparando Identificadores
Entidades também podem ser adicionadas como parâmetros de uma consulta
Query query = session.createQuery("from Item i where i.seller = :seller");
query.setEntity("seller", user);
![Page 32: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/32.jpg)
HQL
Consultas não precisam aparecer no código Na verdade, muitas vezes é melhor que não apareçam Podem ficar nos metadados e serem chamadas pelo nome
Usa-se o método getNamedQuery()
Mas antes, ela precisa ser declarada em algum arquivo de mapeamento ou anotada em alguma entidade
List clientes = session.getNamedQuery(“findClienteByName”)
.setString(“nome”, nome),list()
<query name=“findClienteByName”><![CDATA[from Cliente c where c.nome like :nome]]
</query>
![Page 33: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/33.jpg)
NamedQueries com Annotationpackage auction.model;import ...;@NamedQueries({@NamedQuery(name = "findItemsByDescription",query = "select i from Item i where i.description like :desc"),...})@Entity@Table(name = "ITEM")public class Item { ... }
![Page 34: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/34.jpg)
Paginando o resultado
Query query =
session.createQuery("from User u order by u.name asc");
query.setFirstResult(5);
query.setMaxResults(10);
![Page 35: Hibernate: Consultas Francisco do Nascimento PSC - Programação de Softwares Corporativos UNIBRATEC, outubro de 2008.](https://reader035.fdocumentos.tips/reader035/viewer/2022070311/552fc13c497959413d8da5d1/html5/thumbnails/35.jpg)
Instanciação dinâmica
select new Aluno(
a.id, a.nome, a.idade, a.curso
)
from Aluno a
where a.curso is not null
group by a.nome