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:

