[ HIBERNATE ] Criteria não retorna nenhum resultado [RESOLVIDO]

6 respostas
Delaylahma

Galera,

Estou precisando de uma ajuda, estou tentando utilizar criteria para criar um campo de filtro em um JTextField ( para filtar dados em uma tabela ).
Quando faço consultas ele sempre esta me retornando uma consulta vazia, mesmo quando digito um valor existente.
Estou usando ignoreCase() e MatchMode.ANYWHERE e mesmo assim ele não acha nenhum objeto;

Vou postar a minhas classes:

A classe de busca:

public class FuncionarioDAO extends HibernateAbstractDAO<Funcionario, Long>{

    public FuncionarioDAO() {
    }
    
    public Funcionario loadByMatr(long matr) {  
    	return (Funcionario)getSession().createQuery("FROM Funcionario c WHERE c.numRegistro ="+matr+"").uniqueResult();
    }

	@Override
	public List<Funcionario> select(String chave) {
		Criteria criteria = HibernateUtility.getSession().createCriteria(Funcionario.class);
		if(Numerico.isNumerico(chave)){
			criteria.add(Restrictions.eq("numRegistro",Integer.parseInt(chave)));
			criteria.add(Restrictions.eq("CPF", Long.parseLong(chave)));
		}
		criteria.add(Restrictions.like("nome", chave, MatchMode.ANYWHERE).ignoreCase());
		criteria.add(Restrictions.like("cargo", chave, MatchMode.ANYWHERE).ignoreCase());

		return (List<Funcionario>) criteria.list();
	}
    
}

E a classe Funcionario

public class Funcionario implements Serializable {
	
    private String nome;
    private long CPF;
    private int numRegistro;
    private String senha;
    private String tipo;
    private String cargo;
    private Treinamento treinamento;
    private int horasTreino;

    
    public Funcionario() {
    }
    
    //set e gets
}

O que existe de errado ?
Se alguem puder me ajudar.
Desde já agradeço
[]`s

6 Respostas

von.juliano

Tente usar Restrictions.ilike

Vê se resolve. Flw! :thumbup:

ricardosoares

Você está adicionando ao Criteria 4 restrições. De modo q elas todas sejam iguais (eq) ao mesmo valor (chave).
Creio que nunca o nome do indivíduo seria o mesmo que o cargo dele.
Se vc quer q “chave” valha para qualquer UM dos campos, deve usar OR.

criteria = Restrictions.or(criteria, Restrictions.eq("outroCampo", chave));
Delaylahma

Era esse erro conceitual mesmo, estava adicionando um monte de ANDs ao invés de ORs.
Estou me familiarizando com critéria por agora.
Obrigado ricardosoares, valeu pela ajuda.

O resultado final ficou assim

@Override
	public List<Funcionario> select(String chave) {
		Criteria criteria = HibernateUtility.getSession().createCriteria(Funcionario.class);
                //equivalente a OR
		Disjunction disjuction = Restrictions.disjunction();
		
		if(Numerico.isNumerico(chave)){
            // cláusula A
			disjuction.add(Restrictions.eq("numRegistro",Integer.parseInt(chave)));
            // cláusula B
			disjuction.add(Restrictions.eq("CPF", Long.parseLong(chave)));
		}
		         // cláusula C
                disjuction.add(Restrictions.like("nome", chave, MatchMode.ANYWHERE).ignoreCase());
		         // cláusula D
                disjuction.add(Restrictions.like("cargo", chave, MatchMode.ANYWHERE).ignoreCase());

       //add A v B v C v D
		criteria.add(disjuction);
		return (List<Funcionario>) criteria.list();
	}

Abraços

hugosantos

Também estou me familiarizando mais com hibernate.
Tinha um problema similar e esse post me ajudou muito. Valeu galera.

adrian.gois

Olá Pessoal. Tem como retornar um List ao Invés de um Set, pois estou tendo problema com GWT…

thiago_pco

adrian.gois,

Se não me engano o criteria já retona um List. Mas caso tenha esse problema podes criar um ArrayList a partir do seu Set.

new ArrayList(<Passa o Set aki!>);
Criado 1 de outubro de 2008
Ultima resposta 8 de ago. de 2012
Respostas 6
Participantes 6