39
 Hibernate Query Language & Hibernate Criteria Queries Walter Itamar Mourão [email protected]

Hibernate avançado-hql-criteria

Embed Size (px)

DESCRIPTION

Hibernate com HQL e criteria queries

Citation preview

Page 1: Hibernate avançado-hql-criteria

   

Hibernate Query Language&

Hibernate Criteria Queries

Walter Itamar Mourã[email protected]

Page 2: Hibernate avançado-hql-criteria

   

Hibernate Tools

● Plugin Eclipse, componente do JBoss Tools● Editores, ferramentas para engenharia reversa e 

prototipação de queries.

Page 3: Hibernate avançado-hql-criteria

   

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%'

Page 4: Hibernate avançado-hql-criteria

   

Palavras chave

● Derivadas do SQL● Não diferenciadas por maiúsculas/minúsculas (mas 

as classes e atributos são !)

Page 5: Hibernate avançado-hql-criteria

   

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

Page 6: Hibernate avançado-hql-criteria

   

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

Page 7: Hibernate avançado-hql-criteria

   

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

Page 8: Hibernate avançado-hql-criteria

   

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

Page 9: Hibernate avançado-hql-criteria

   

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

Page 10: Hibernate avançado-hql-criteria

   

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

Page 11: Hibernate avançado-hql-criteria

   

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

Page 12: Hibernate avançado-hql-criteria

   

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

Page 13: Hibernate avançado-hql-criteria

   

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 EJB­QL 3.0: substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), mod(), coalesce(), nullif()

● Conversões para string: str()

Page 14: Hibernate avançado-hql-criteria

   

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() 

Page 15: Hibernate avançado-hql-criteria

   

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) 

Page 16: Hibernate avançado-hql-criteria

   

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.

Page 17: Hibernate avançado-hql-criteria

   

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

Page 18: Hibernate avançado-hql-criteria

   

Outros retornos

● O result set pode ser um um list, usando­se “select new list(...)”

● O result set pode ser um map, usando­se “select new map(...)”

Page 19: Hibernate avançado-hql-criteria

   

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

Page 20: Hibernate avançado-hql-criteria

   

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();

Page 21: Hibernate avançado-hql-criteria

   

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.

Page 22: Hibernate avançado-hql-criteria

   

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.

Page 23: Hibernate avançado-hql-criteria

   

Queries nomeadas

● Pode­se colocar as queries dentro dos arquivos de mapeamento (*.hbm.xml), atribuindo nomes.Ex:<hibernate­mapping><query name="Book.by.isbn"><![CDATA[from Book where isbn = ?]]></query></hibernate­mapping>…Query query = session.getNamedQuery("Book.by.isbn");query.setString(0, "1932394419");Book book = (Book) query.uniqueResult();

Page 24: Hibernate avançado-hql-criteria

   

HQL & Andromda

● Para escrever queries HQL diretamente no modelo, crie um método na <<Entity>> marque­o 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.

● Pode­se retornar um Collection ou uma classe específica, nesse caso o método uniqueResult() da interface org.hibernate.Query é usado.

Page 25: Hibernate avançado-hql-criteria

   

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();

Page 26: Hibernate avançado-hql-criteria

   

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();

Page 27: Hibernate avançado-hql-criteria

   

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();

Page 28: Hibernate avançado-hql-criteria

   

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();

Page 29: Hibernate avançado-hql-criteria

   

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();

Page 30: Hibernate avançado-hql-criteria

   

Associações usando apelidos

● Pode­se 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();

Page 31: Hibernate avançado-hql-criteria

   

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();

Page 32: Hibernate avançado-hql-criteria

   

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();

Page 33: Hibernate avançado-hql-criteria

   

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.

Page 34: Hibernate avançado-hql-criteria

   

Criteria & Andromda

● Use o estereótipo <<Criteria>> para criar classes que representem consultas na persistência

Page 35: Hibernate avançado-hql-criteria

   

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:

Page 36: Hibernate avançado-hql-criteria

   

SQL

● Use o método Session.createSQLQuery para executar queries SQL.

Ex:SQLQuery qry=session.createSQLQuery(“select * from PERFIL”);List lst=qry.list();

Page 37: Hibernate avançado-hql-criteria

   

Dicas

● A classe SessionFactoryUtils tem métodos utilitários em geral, inclusive para retornar a sessão Hibernate atual

Page 38: Hibernate avançado-hql-criteria

   

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 pode­se um passar o resultado da execução de uma Criteria (ou de uma <<Criteria>>)

Page 39: Hibernate avançado-hql-criteria

   

Referências

● http://docs.jboss.org/hibernate/stable/core/api/● http://www.hibernate.org/hib_docs/v3/reference/en­

US/html/