Uma das coisas legais do Hibernate, é a API Criteria, para quem não tem muita intimidade com Banco de Dados, e precisa em Java extrair informações do banco, o Hibernate torna isto bastante intuitivo com o Criteria, ela mapeia funcionalidades de SQL em Objetos, ou seja pode-se usar uma IDE como o Eclipse para code inserting para montar códigos para buscar e filtrar informações. Vou mostrar aqui alguns exemplos de busca com Criteria.
Para ter a referência da Criteria de uma classe, devemos fazer o seguinte código:
Criteria c = getSession().createCriteria(UmaClasseQualquer.class);
Bom, para seguir com nossos exemplos, vou usar duas classes mapeadas no Hibernate (Estado e Cidade), os códigos delas seguem abaixo:
@Entity
public class Estados {
@Id
@Column(name="uf", length=2,columnDefinition="varchar(2)")
private String uf;
@Column(name="descricao", length=30,columnDefinition="varchar(30)")
private String descricao;
//SETs e GETs
}
public class Cidades {
@Id
@Column(name="codigo", length=3,columnDefinition="int")
private Integer codigo;
@Column(name="descricao", length=40,columnDefinition="varchar(40)")
private String descricao;
@ManyToOne @JoinColumn(name="uf")
private Estados estado;
//SETs e GETs
}
Agora vamos começar com nossos exemplos, primeiro vou mostrar o mais simples, listar todos estados.
Criteria c = getSession().createCriteria(Estados.class);
List todosEstados = c.list();
Fazer filtros fica bastante intuitivo com Criteria, no exemplo abaixo, vou listar todas as cidades do Estado de São Paulo.
Criteria c = getSession().createCriteria(Cidades.class);
c.add( Restrictions.eq("estado.uf", "SP") );
List cidadesDeSaoPaulo = c.list();
Bom, muitos já devem estar pensando como mostrar estas cidades por ordem crescente do nome, vejam como fica:
Criteria c = getSession().createCriteria(Cidades.class);
c.add( Restrictions.eq("estado.uf", "SP") );
c.addOrder( Order.asc("descricao") );
List cidadesDeSaoPaulo = c.list();
E tem mais... É muito comum em SQL usar-mos GROUP BY, então vou mostrar agora com Criteria uma listagem que soma as quantidades de cidades de cada Estado.
Criteria c = getSession().createCriteria(Cidades.class);
c.createAlias("estado", "est");
c.setProjection(
Projections.projectionList()
.add( Projections.groupProperty("est.uf") )
.add( Projections.groupProperty("est.descricao") )
.add( Projections.rowCount() ,"qtdeCidades" )
);
List totalDeCidades = c.list();
Agora, o que eu acho mais legal no Criteria, é o Example Queries, onde a Criteria vai fazer um filtro a partir dos dados da instância da classe passada para ela, vejam como fica para listar todas as cidades onde o nome inicia com a letra "S":
Cidades cidade = new Cidades();
cidade.setDescricao("S%");
Criteria c = getSession().createCriteria(Cidades.class);
c.add(Example.create(cidade).enableLike());
List cidadesInitS = c.list();
Para quem quiser ver estes exemplos rodando na sua própria máquina, aqui tem o projeto fonte com todos estes exemplos acima. Neste projeto o Hibernate esta configurando para usar o Banco de Dados Derby. E e como não gosto de ficar escrevendo XMLs, fiz uso do Spring Annotations para carregar os Bean do HIbernate no contexto de forma fácil e prática. Então, neste projeto além de aprender Criteria é uma ótima oportunidade nestes exemplos de ver o Spring Annotations com hibernate funcionando como também o Derby.