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:
[code]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();
}
}[/code]
E a classe Funcionario
[code] 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
}[/code]
O que existe de errado ?
Se alguem puder me ajudar.
Desde já agradeço
[]`s
Tente usar Restrictions.ilike
Vê se resolve. Flw! :thumbup:
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));
Era esse erro conceitual mesmo, estava adicionando um monte de ANDs ao invés de OR
s.
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
Também estou me familiarizando mais com hibernate.
Tinha um problema similar e esse post me ajudou muito. Valeu galera.
Olá Pessoal. Tem como retornar um List ao Invés de um Set, pois estou tendo problema com GWT…
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!>);