Olá pessoal.
Estou implementando um projeto teste onde tenho que usar JTA porém gostaria demasiadamente de utilizar o Criteria do hibernate, o que está mostrando-se ser incompatível.
O motivo que desejo utilizar o Criteria, e poder criar queries condicionais. Isso achei bem mais fácil fazer e deixaria o código muito mais limpo utilizando o Criteria do Hibernate do que o CriteriaQuery do JPA.
Explicando no exemplo
Objeto Modelo:
public class Atividade(){
private String nome;
private Data dataInicio;
private Data dataFim;
//Getters and Setters.
}
ObjetoFilter:
public class AtividadeFiltro(){
private Date dataInicio;
private Date dataFim;
//Getters and Setters.
}
Classe EJB:
public List Atividade buscarFiltrado(AtividadeFiltro){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Atividade> cq = cb.createQuery(Atividade.class);
Root<Atividade> root = cq.from(Atividade.class);
if(atividadeFiltrado.getDatacriacaoDe() != null)
cq.where(cb.greaterThanOrEqualTo(root.<Date>get("dataInicio"), atividadeFiltrado.getDataInicio()));
if(atividadeFiltrado.getDatacriacaoAte() != null)
cq.where(cb.lessThanOrEqualTo(root.<Date>get("dataFim"), atividadeFiltrado.getDataFim()));
Neste caso eu tenho o seguinte problema. Quando preencho os dois campos (imagem 1) é executado apenas a última query(imagem 2). Eu não consigo fazer um between.
Lógico, eu sei que existe a função between mas pode acontecer de um dos campos virem vazio. E nesta caso estou dando o exemplo de campo relacionados, dataInicio e dataFim. Imagine que eu quisesse buscar todas as atividades do criador, exemplo João, com a data de criação da tarefa maior do que X. No caso o nome do criador seria descartado, caso viesse em primeiro lugar.
Com o criteria do hibernate, vi que você pode simplesmente ir validando os atributos e em seguida adicionar os parametros de filtro, como este exemplo que peguem, aleatoriamente, na internet:
//Os comparadores lógicos, no nosso caso IF, coloquei por conta própria para que chegue em um caso mais proximo que sejo. Como falado isto e apenas um exemplo obtido na internet.
List cats = sess.createCriteria(Cat.class)
if(StringUtil.isNorBlank("name"){
.add( Restrictions.like("name", "Fritz%") )
}
if(StringUtil.isNotBlank("age"){
.add( Restrictions.or(
Restrictions.eq( "age", new Integer(0) ),
Restrictions.isNull("age")
) )}
.list();
A pergunta seria:
- É possível realizar esta implementação. Até melhor, seria necessário utilizar esta implementação ou consigo eu fazer um algo parecido utilizado o JPA ?
Anexos:
Imagem 1:
Imagem 2: