Upload
walter-mourao
View
8.085
Download
0
Embed Size (px)
DESCRIPTION
Hibernate com HQL e criteria queries
Citation preview
Hibernate Tools
● Plugin Eclipse, componente do JBoss Tools● Editores, ferramentas para engenharia reversa e
prototipação de queries.
HQL
● Hibernate Query Language: linguagem de consulta baseada em SQL, porém com extensões para suportar classes.
● Indicado quando a query é estática (relatórios, por exemplo).Ex.:
select g.id from Grupo g where g.descricao like 'A%'
from Usuario u join u.grupo
from Usuario u where u.grupo.descricao like 'A%'
Palavras chave
● Derivadas do SQL● Não diferenciadas por maiúsculas/minúsculas (mas
as classes e atributos são !)
Palavras chave: from
A query mais simples do HQL:
from <classe> [apelido]
retorna todas as instâncias daquela classe. Ex:
from br.ita.finep.icammh.domain.ResultadoColeta
from br.ita.finep.icammh.domain.ResultadoColeta rc
Palavras chave: select
Seleciona objetos e propriedades a serem retornados no result set:
select <objetos.propriedades> from …
Ex:
select rc.id, rc.nomeArquivo from br.ita.finep.icammh.domain.ResultadoColeta rc
Palavras chave: where
Acrescentra condições para filtragem do result set:
select … from … where <condição>
Ex:
select rc.id, rc.nomeArquivo from br.ita.finep.icammh.domain.ResultadoColeta rcwhere rc.id>20
Outras Palavras chave
● order by: ordenação do result set● group by: agrupamento do result set
Ex:select tamanho from br.ita.finep.icammh.domain.CampoParametro group by tamanho
Junções Implícitas
● Objetos visíveis podem ser referenciados diretamente.Ex:
select rc.coleta.nome, rc.coleta.tipoColeta.nomefrom br.ita.finep.icammh.domain.ResultadoColeta rcwhere rc.id < 200
Junções Explícitas
● Use a palavra chave join para explicitar a junção e definir apelidosEx:
select col.nome, col.tipoColeta.nomefrom br.ita.finep.icammh.domain.ResultadoColeta rcjoin rc.coleta colwhere rc.id < 200
Funções de agregação
● avg(...), sum(...), min(...), max(...)● count(*)● count(...), count(distinct ...), count(all...)
Ex:
select avg(rc.id) from br.ita.finep.icammh.domain.ResultadoColeta rc
Expressões suportadas em condições
● Operadores matemáticos: +, , *, /● Comparadores lógicos: =, >=, <=, <>, !=, like, in,
not in, between, is null, is not null, is empty, is not empty, member of and not member of
● Operações lógicas: and, or, not● Parenteses indicando agrupamento: ( )● Case: case ... when ... then ... else ... end
Expressões suportadas em condições
● Concatenação de strings: ||, concat(...,...)● Expressões temporais: current_date(),
current_time(), and current_timestamp(), second(...), minute(...), hour(...), day(...), month(...), year(...)
● Expressões EJBQL 3.0: substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), mod(), coalesce(), nullif()
● Conversões para string: str()
Expressões suportadas em condições
● Conversão de tipo: cast(... as ...), extract(... from ...)● Parâmetros posicionais e nomeados: ?, :nomePar● Operações em coleções: [any, some, all, exists]
elements(), indices(), size(), minelement(), maxelement(), minindex(), maxindex(),
● Qualquer função suportada pelo SQL do BD destino: sign(), trunc(), rtrim(), sin()
Subqueries
● Subqueries são suportadas em bancos de dados que suportam subqueries.Ex:
from br.ita.finep.icammh.domain.Coleta colwhere col.id in (select af.id from br.ita.finep.bdhr.domain.AgenciaFinanceira af)
Interface Query
● Regras de retorno no result set:● Se não existe cláusula select
● Se a cláusula from referencia uma única classe, cada linha do result set é uma instância dessa classe.
● Se a cláusula from referencia mais de uma classe, o result set é composto por Object[] onde cada entrada é uma instância de cada classe referenciada.
● Se existe a cláusula select● Com um único elemento, cada linha do result set é
uma instância desse elemento.● Com vários elementos, cada linha do result set é um
Object[] onde cada entrada é uma instância de cada elemento.
Retornando Instâncias de VOs
● É possível criar instâncias de value objects diretamente no HQL: select new <ClasseVO>(...) from …
Ex:
select new br.ita.finep.icammh.sad.common.PerfilVO(p.id,p.nome)from br.ita.finep.icammh.domain.Perfil p
Outros retornos
● O result set pode ser um um list, usandose “select new list(...)”
● O result set pode ser um map, usandose “select new map(...)”
Update & Delete
● Sintaxe semelhante ao SQL: ( update | delete) [from] EntityName (where <condições>)Ex:
delete br.ita.finep.icammh.domain.Coleta col where col.id > 2000000
update br.ita.finep.icammh.domain.Coleta col set col.nomeArquivo=:novoNomeArquivo where col.id > 2000000
Interface Query
● O HQL é executado a partir de uma instância de org.hibernate.Query, obtida da instância do Session
Query query = session.createQuery("from Book");List books = query.list();
…Query query = session.createQuery("from Book");Iterator itBooks = query.iterate();
...Query query = session.createQuery("from Book where isbn=:isbn");query.setString("isbn", "1932394419");Book book = (Book) query.uniqueResult();
Parâmetros
● Parâmetros podem ser passados com a notação '?' ou ':'...
Query query = session.createQuery("from Book where isbn = ?");query.setString(0, "1932394419");Book book = (Book) query.uniqueResult();
**** atenção: o primeiro parâmetro é o 0, diferentemente do SQL***
…Query query = session.createQuery("from Book where isbn = :isbn");query.setString("isbn", "1932394419");Book book = (Book) query.uniqueResult();
● Usando o método query.setProperties, um JavaBean pode ser passado como parâmetro. Os getters serão usados para atribuir valores aos parâmetros da query.
Performance HQL
● Métodos que influenciam na performance:
...query.setFirstResult(20);
...query.setMaxResults(10);
...query.setFetchSize(100);
● O método uniqueResult retorna o objeto único que a query retorna, null se o result set é vazio, ou dispara a exceção NonUniqueResultException caso o result set retorne mais de uma instância.
Queries nomeadas
● Podese colocar as queries dentro dos arquivos de mapeamento (*.hbm.xml), atribuindo nomes.Ex:<hibernatemapping><query name="Book.by.isbn"><![CDATA[from Book where isbn = ?]]></query></hibernatemapping>…Query query = session.getNamedQuery("Book.by.isbn");query.setString(0, "1932394419");Book book = (Book) query.uniqueResult();
HQL & Andromda
● Para escrever queries HQL diretamente no modelo, crie um método na <<Entity>> marqueo como “Query” e escreva a query no valor etiquetado @andromda.hibernate.query
● Os parâmetros do método devem ter o mesmo nome dos parâmetros dentro da query.
● Podese retornar um Collection ou uma classe específica, nesse caso o método uniqueResult() da interface org.hibernate.Query é usado.
Hibernate Criteria Queries
● Mecanismo de consultas 100% Java.● Indicado para situações onde a query deve ser
criada dinamicamente.● A sessão corrente retorna instâncias da Criteria
através do método createCriteria.
Ex:Criteria criteria = session.createCriteria(Book.class)List books = criteria.list();
Equivale a:Query query=session.createQuery(“from Book”);List books = query.list();
Restrições
● Restrições são acrescentadas através de factories da classe org.hibernate.criterion.RestrictionsEx:
Criteria criteria=session.createCriteria(br.ita.finep.icammh.domain.Perfil.class);criteria.add(Restrictions.ilike("nome","P%"));criteria.list();
Expressões Lógicas
● Podem ser expressas com Restrictions.and, Restrictions.or ou Restrictions.conjunction e Restrictions.disjunction.Ex:Criteria criteria=session.createCriteria(br.ita.finep.icammh.domain.Perfil.class);Disjunction dj=Restrictions.disjunction();dj.add(Restrictions.le("id",10L));dj.add(Restrictions.ge("id",50L));criteria.add(dj);criteria.list();
Ordenação
● Use o método addOrder e a classe org.hibernate.criterion.Order para ordenar o resultado
Ex:Criteria criteria=session.createCriteria(br.ita.finep.icammh.domain.Perfil.class);criteria.add(Restrictions.ilike("nome","P%"));criteria.addOrder(Order.desc("id"));criteria.list();
Associações
● O método createCriteria permite a inclusão de associações na consulta
Ex:Criteria criteria=session.createCriteria(br.ita.finep.icammh.domain.PerfilCampos.class);criteria.add(Restrictions.lt("id",10L));Criteria critPerfil=criteria.createCriteria("perfil");critPerfil.add(Restrictions.ilike("nome","P%"));criteria.list();
Associações usando apelidos
● Podese criar apelidos para as associações com o método createAlias
Ex:Criteria criteria=session.createCriteria(br.ita.finep.icammh.domain.PerfilCampos.class);criteria.add(Restrictions.lt("id",10L));criteria.createAlias("perfil","p");criteria.add(Restrictions.ilike("p.nome","P%"));criteria.list();
Agrupamentos
● Projeções e agrupamentos são criados com o método setProjection e com a classe org.hibernate.criterion.Projections
Ex:Criteria criteria=session.createCriteria(br.ita.finep.icammh.domain.PerfilCampos.class);criteria.add(Restrictions.lt("id",10L));criteria.setProjection(Projections.rowCount());criteria.list();
Criteria desacoplada da sessão
● A classe org.hibernate.criterion.DetachedCriteria permite a criação de consultas desacopladas da sessão
Ex:DetachedCriteria dc=DetachedCriteria.forClass(br.ita.finep.icammh.domain.PerfilCampos.class);dc.add(Restrictions.lt("id",10L));dc.getExecutableCriteria(session).list();
Performance
● Métodos que influenciam na performance:
...criteria.setFirstResult(20);
...criteria.setMaxResults(10);
...criteria.setFetchSize(100);
● O método uniqueResult retorna o objeto único que a consulta retorna, null se o result set é vazio, ou dispara a exceção NonUniqueResultException caso o result set retorne mais de uma instância.
Criteria & Andromda
● Use o estereótipo <<Criteria>> para criar classes que representem consultas na persistência
Criteria & Andromda
● O cartucho Hibernate gera uma classe Search para facilitar a criação de consultas no código Java, e os DAOs gerados contém métodos para a execução dessas consultas.
Ex:
SQL
● Use o método Session.createSQLQuery para executar queries SQL.
Ex:SQLQuery qry=session.createSQLQuery(“select * from PERFIL”);List lst=qry.list();
Dicas
● A classe SessionFactoryUtils tem métodos utilitários em geral, inclusive para retornar a sessão Hibernate atual
Hibernate & Jasper Reports
● O Jasper Reports suporta HQL de forma nativa● O Jasper Reports pode receber um Collection de
beans como base de dados para o relatório, portanto podese um passar o resultado da execução de uma Criteria (ou de uma <<Criteria>>)
Referências
● http://docs.jboss.org/hibernate/stable/core/api/● http://www.hibernate.org/hib_docs/v3/reference/en
US/html/