Estou com um problema ao criar uma query no hibernate.
Eu possuo um objeto Transaction que contém um relacionamento de many-to-one com o objeto User.
Eu preciso escrever uma consulta na minha DAO para buscar as Tansactions por id, mas gostaria de colocar uma verificação adicional para comparar o user também. Ou seja, o findById só retornará se houver um registro com o Id informado e se ele também for do usuário que está pedindo o find.
Daí eu fiz a seguinte query:
Criteria crit = this.getSession().CreateCriteria(Transaction.class);
crit.add(Restriction.idEq(pkObject))
crit.add(Restriction.eq("user", userObject))
List result = crit.list();
O problema com a query acima é que ela está retornado 2 vezes a mesma Tansaction. E eu só tenho 1 no banco de dados atualmente. Ele está devolvendo a Transaction com o id 1 duas vezes.
Eu estou me perguntando se o problema está em eu usar a propriedade user na query. Será que eu deveria fazer especificando um join entre estes objetos, usando o fetch mode, etc?
Eu reescrevi a query acima usando uma named query assim e ela funcionou corretamente:
from Transaction t
where t.id = :id
and t.user = :user
Mas eu gostaria de tentar fazer o criteria funcionar.
Alguém pode me ajudar?
Eu me lembro de ter feito uns testes com o Restrictions.And e de não ter funcionado.
De toda forma, eu vou me certificar de que fiz igual ao código que vc colocou. Obrigado pela ajuda
Também fiquei pensando se não teria que fazer algo do tipo:
Criteria crit = this.getSession().CreateCriteria(Transaction.class);
crit.add(Restriction.idEq(pkObject)).createCriteria(User.class).add(Restriction.idEq(userObject.getId()));
List result = crit.list();
Eu me lembro de ter feito uns testes com o Restrictions.And e de não ter funcionado.
De toda forma, eu vou me certificar de que fiz igual ao código que vc colocou. Obrigado pela ajuda
Também fiquei pensando se não teria que fazer algo do tipo:
Criteria crit = this.getSession().CreateCriteria(Transaction.class);
crit.add(Restriction.idEq(pkObject)).createCriteria(User.class).add(Restriction.idEq(userObject.getId()));
List result = crit.list();
Eu ainda não tentei, mas vou tentar quando chegar em casa.
Será que pode haver alguma coisa errada com os meus relacionamentos e isso pode estar impactando no resultado da consulta? Afinal, eu tenho mais objetos e relacionamentos do que apenas Transaction e User.
Uma coisa que vou verificar também é se o método equals está ok em todos eles.