[Hibernate] Consultas HQL com joins retornando resultados repetidos

Olá pessoal,

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.

E aí, o que vocês me dizem?

Obrigado.

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.

[ ]s, Guilherme Chapiewski

No meu caso, a consulta é assim:

select cycOcc from CycleOccurrence cycOcc left join fetch cycOcc.routeDates where cycOcc.cycle = ?

A intenção é que ele retornasse uma coleção de CycleOccurrence com as coleções de RouteDates devidamente preenchidas.

Porém ele me retorna uma coleção com CycleOccurrence repetidos.

E aí?

basta vc implementar os métodos equals e hashcode para q não haja repetição de objetos e:

List list = SeuDAO.seuMetodoQPegaOsDados(…);

Set set = new LinkedHahSet( list );

pronto!

sua coleção de objetos sem repetição.

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

No cenário que eu tinha essa foi a única solução.