O NHibernate é um framework ORM extremamente versátil com diversos pontos de extensibilidade que pode ser vista nas diversas opções que temos de mapeamento, gerenciamento de sessão e consultas . No que tange as consultas temos opções como, por exemplo, o SQL Nativo, HQL, Criterias e o recente QueryOver. Hoje focaremos nos recursos para realizações de consultas via Criteria, abordando desde consultas simples envolvendo uma única tabela à consultas mais complexas, com agrupamentos, sumas e outras funções. Para isso, faremos uma introdução rápida sobre as consultas no NHibernate, demonstrando como executar SQLs e HQLS e realizar o parse para objetos de domínio. Veremos também os conceitos fundamentais das Criterias e um exemplo onde teremos uma entidade Pedido relacionada com diversos Itens, que servirá de base para criarmos nossos exemplos de consultas.
Em que situação o tema é útil
Este tema é útil a todos os projetos que tenham a necessidade de
recuperação de dados através do NHibernate, possibilitando que o leitor conheça
as principais formas de recuperação de dados e domine os recursos fornecidos
pelas Criterias do NHibernate.
O NHibernate é extremamente versátil e nos fornece diversas opções para recuperação de dados, sendo elas:
· SQL – Execução de queries utilizando SQL nativo.
· HQL – Execução de queries utilizando Hibernate Query Languag.
· Criterias – Execução de queries utilizando a API de Criterias do NH, baseada no pattern Fluent Interface.
· QueryOver – Execução de queries a partir expressões Lambda.
O uso de SQL é a opção mais básica e provavelmente a menos adequada ao ambiente ORM, pois inserindo código SQL na nossa aplicação estamos correndo o risco de sofrer problemas de compatibilidade de bases de dados caso seja necessário rodar a aplicação para outro SGDB. Além disso, torna a manutenção da aplicação mais difícil e suscetível a erros. Podemos ver um exemplo de uso de SQL na Listagem 1. Observe na linha 3 que é preciso adicionar o tipo da entidade para que o NHibernate realize automaticamente o parse do resultado da consulta para o tipo especificado no AddEntity.
Listagem 1. Exemplo de consulta com SQL nativo no NHibernate
01 ISession sessao = NHSessionFactoryManager.
GetSessionFactory().OpenSession();
02 ISQLQuery query = sessao.CreateSQLQuery
("select id, nome, idade,
sexo from cliente");
03 query.AddEntity(typeof(Cliente));
04 IList<Cliente> listaConsulta =
query.List<Cliente>();
05 return listaConsulta;
O uso de HQL não tem o problema da compatibilidade, pois utilizamos uma linguagem intermediária do próprio NHibernate, ficando o mesmo responsável por realizar o parse para o SQL nativo do SGDB usado na aplicação. Por outro lado, temos ainda o problema da manutenção, por termos as famosas “magic strings” no nosso código. Na Listagem 2 podemos ver um exemplo de consulta com o HQL, em que não precisamos do AddEntity, pois o NHibernate já realiza o parse automaticamente para o tipo especificado no generic do List. Outro item a observar é que simplesmente executamos “From Cliente”, entendendo que desejamos a instância completa dos objetos Cliente.
Listagem 2. Exemplo de consulta com HQL no NHibernate
01 ISession sessao =
NHSessionFactoryManager.GetSessionFactory().OpenSession();
02 IQuery query = sessao.CreateQuery("from Cliente");
03 IList<Cliente> listaConsulta =
query.List<Cliente>();
04 return listaConsulta;
Melhorando as nossas opções nós temos as criterias que tratam-se de objetos de consulta que nos permitem determinar os parâmetros, restrições e características das consultas que desejamos usar, só que através de objetos fortemente tipados. Com isso, não temos as “magic string” para elaboração do código SQL. Um exemplo de consulta com Criteria pode ser visto na Listagem 3, onde podemos ver que não precisamos de códigos em texto, fazendo a operação de consulta através do próprio objeto Criteria. Neste caso só será necessário usar strings quando precisarmos referenciar alguma propriedade para realizar filtros, agrupamentos, ordenação etc.
Listagem 3. Exemplo de consulta com Criteria no NHibernate
01 ISession sessao =
NHSessionFactoryManager.GetSessionFactory().OpenSession();
02 ICriteria criteria = sessao.CreateCriteria<Cliente>();
03 IList<Cliente> listaConsulta =
criteria.List<Cliente>();
04 return listaConsulta;
Por fim temos a opção mais recente, QueryOver, que foi introduzido no NHibernate a partir da versão 3.0 e combina extension methods e expressões lambda para eliminar de vez as strings de nossas consultas, permitindo que propriedades sejam especificadas através delas. Na Listagem 4 podemos ver um exemplo.
Listagem 4. Exemplo de consulta com QueryOver no NHibernate
01 ISession sessao =
NHSessionFactoryManager.GetSessionFactory().OpenSession();
02 IQueryOver<Cliente> queryOver =
sessao.QueryOver<Cliente>().Where
(x => x.Sexo == "Masculino");
03 IList<Cliente> listaConsulta =
queryOver.List<Cliente>();
04 return listaConsulta;
Sendo assim, podemos ver que as opções mais indicadas são o uso de Criterias ou QueryOver. Hoje focaremos no uso do Criteria. Vale ressaltar que é importante conhecer as demais formas via SQL e HQL, pois podem haver requisitos no projeto em que os mesmos sejam mais adequados. Em especial as consultas via SQL são mais comuns de serem utilizadas em aplicações legadas, que não possuem um modelo muito bem definido e passam por um momento de transição para ORM.
Entendendo o ICriteria do NH
Como podemos notar nos exemplos anteriores, o Criteria do NHibernate implementa uma interface chamada ICriteria e pra criarmos uma criteria precisamos invocar o método CreateCriteria de um ISession. Um objeto Criteria possui os seguintes métodos:
· Add – Este método recebe um objeto ICriterion e é responsável pela inclusão de novas condições na criteria.
· AddOrder – Este método recebe um objeto Order como parâmetro, com a indicação da direção da ordenação e da propriedade a ser ordenada.
· CreateAlias – Permite a criação de um alias para uma associação do objeto principal da criteria.
· CreateCriteria – Permite que seja criada uma nova criteria referente a um objeto associado ao objeto da criteria principal.
· List – Executa a criteria transformando a mesma em código SQL e retornar o resultado em uma lista de objetos.
· SetFetchMode – Permite determinarmos uma estratégia de fetch para uma determinada associação do objeto principal da criteria.
· ...
Confira outros conteúdos:
Teste unitário com NUnit
Como migrar projetos do ASP.NET MVC...
Crie relatórios com o Stimulsoft...
Black November
Desconto exclusivo para as primeiras 200 matrículas!
Pagamento anual
12x no cartão
De: R$ 69,00
Por: R$ 54,90
Total: R$ 658,80
Garanta o desconto
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- 12 meses de acesso
Pagamento recorrente
Cobrado mensalmente no cartão
De: R$ 79,00
Por: R$ 54,90 /mês
Total: R$ 658,80
Garanta o desconto
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- Fidelidade de 12 meses
- Não compromete o limite do seu cartão
<Perguntas frequentes>
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.