Olá, estou com um problema com uma busca no banco usando Criteria.
Tenho determinada tabela com dois campos que no banco são apenas 'bigInt" mas no código, ambos são objetos de outras entidades (criando assim um relacionamento). Vejam abaixo a declaração de tais campos no código:
@OneToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(referencedColumnName = "id", name = "caminho", nullable = true)
private Caminho caminho;
@OneToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(referencedColumnName = "id", name = "caminhoTimeout", nullable = true)
private Caminho caminhoTimeout;
// outros atributos + getters e setters
O campo caminho, sempre estará preenchido mas o campoTimeout pode estar preenchido ou null.
O problema é quando vou fazer uma busca no banco. Quero descobrir apenas se determinado valor já está sendo usado em algum registro no campo “caminho”. Por exemplo: se algum registro já possui o valor 4 no campo caminho (repare que desconsidero o campo caminhoTimeout, ele nao me interessa agora).
O fato é que, mesmo se tiver um registro que atenda minhas necessidades, ele não retorna na busca se o campo caminhoTimeout estiver null. Se o caminhoTimeout estiver preenchido, ele retorna sem problemas, mas se estiver null o registro é ignorado, mesmo que eu nem use esse campo como parâmetro.
Abaixo segue meu método de busca com Criteria.
public List<Regra> buscarPorCaminho(Long caminhoId) {
Session session = getCurrentSession();
List<Regra> regras = new ArrayList<Regra>();
try {
Criteria query = session.createCriteria(Regra.class);
query.createAlias("caminho", "caminho");
query.add(Restrictions.eq("caminho.id", caminhoId));
regras = query.list();
return regras;
} catch (Exception e) {
System.out.println( "Pesquisa não concluída. Favor verificar");
e.printStackTrace();
}
return regras;
}
ja tentei de tudo, até mesmo substituindo trecho do método para usar o OR do criteria:
[code]
Criterion q1 = Restrictions.and(Restrictions.eq(“caminho.id”, caminhoId), Restrictions.isNull(“caminhoTimeout”)) ;
Criterion q2 = Restrictions.and(Restrictions.eq(“caminho.id”, caminhoId), Restrictions.isNotNull(“caminhoTimeout”)) ;
query.add( Restrictions.or(q1, q2) );[/code]
e mesmo assim o resultado é o mesmo, o registro só é retornado se ambos os campos estiverem preenchidos, mesmo que eu só pesquise por um deles.
Alguém tem alguma ideia de como resolver isso? Qualquer dica é muito bem vinda.