JAVA EE :: JTA com Hibernate Criteria (Queries condicionais)

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:

  1. É 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:

O where aceita um array como parâmetro.

Você pode converter a sua List de condições para um array desta forma:

List<Predicate> predicates = new ArrayList<Predicate>(); --Faz o add dos predicates na List... criteria.where(predicates.toArray(new Predicate[predicates.size()]));

1 curtida

Maravilha. Muito obrigado. Não tinha me passado isso na cabeça. Eu sempre procuro a forma mais complexa de fazer.

Disponha :slight_smile:

Tente:

Criteria criteria = session.createCriteria(Atividade.class);
criteria.add(Restrictions.between(“dataCriacao”, dataInicio, dataFim));

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html