Quando uso join em HQL, ele está retornando na coleção várias referências do mesmo objeto, ao invés de retornar um único objeto.
Por que isso acontece? Como resolver este problema?
Vi que há um artigo na javamagazine no qual o autor sugere que se faça um for identificando os itens repetidos e os elimine. Mas isso me parece estranho.
Dependendo do tipo de join que você fizer e a quantidade de registros que tiver nas suas tabelas relacionadas é possível que isso aconteça.
Vou dar um exemplo tosco que é a primeira coisa que veio na cabeça.
Imagina que você tem uma tabela MATERIAS onde você tem uma relação de notícias de jornal e FOTOS onde você tem uma relação de fotos das matérias. A relação é 1:1, ou seja, para cada MATERIA você tem uma FOTO.
Aí você faz a consulta para obter a matéria com a foto:
SELECT * FROM MATERIAS m
INNER JOIN FOTOS f ON m.materia_id = f.materia_id
WHERE m.materia_id = 1;
Então, somente um registro deverá ser retornardo considerando que só foi cadastrada uma foto por matéria.
MAS, digamos que por acaso alguém cadastrou equivocadamente duas fotos para a mesma matéria (ou seja, dois registros na tabela FOTOS com o mesmo materia_id).
Neste caso a mesma query que retornou somente um registro passará a retornar dois.
É bem possível que o seu problema seja algo do tipo pois eu já usei Hibernate várias vezes e isso unnca me aconteceu.
Verifique suas queries e seus dados para ver se você não tem um problema deste tipo.
Sei que este post é antigo, mas caso ainda não tenha resolvido este caso, utilize a palavra distinct em sua HQL, isso fará com que o Hibernate não traga valores repetidos.
No exemplo acima por exemplo ficaria da seguinte forma.
Sei que o tópico é antigo mas é exatamente o meu problema.
Tenho uma view no postgres que é composta por 3 campos varchar e 1 integer.
Mapei a view no Java com 3 campos String e 1 BigDecimal e minha consulta está assim:
A consulta é criada por:
Crio a consulta assim:
E executo:
Me é retornado a mesma quantidade de registros que há na view, porém os objetos vem com dados repetidos.
Já implementei o hashCode com todos os campos disponíveis na view e nada.
Alguém tem alguma dica?
Desde já agradeço pela(s) resposta(s).
Bom, acabei achando a resposta num site em inglês.
O lance é o seguinte, no meu caso a minha entidade era uma view que foi montada através de vários unions, todos os campos eram Strings com exceção de um que era Integer, como consequência eu poderia ter vários registros com a mesma chave. Ex:
Id | Nome | Idade
-------------------------
Crianca | Carlos | 12
Crianca | Joaquim | 13
Adulto | Maria | 30
Adulto | Joana | 21
O hibernate executava a consulta e quando ele recuperava o 1º registro e manti-o na memória, assim que fosse recuperado o 2º registro o hibernate comparava a chave e interpretava como sendo o mesmo objeto 2x, o acarretava em:
Id | Nome | Idade
-------------------------
Crianca | Carlos | 12
Crianca | Carlos | 12
Adulto | Maria | 21
Adulto | Maria | 21
Nenhuma configuração no hibernate resolveu meu problema (sobrescrever hasCode, desabilitar cache, nada…) o que eu fiz foi criar uma chave única para cada registro. Ex:
Id | Nome | Idade
------------------------------
Crianca-Carlos | Carlos | 12
Adulto-Maria | Maria | 21