[RESOLVIDO] Usando Criteria Distinct Resultados duplicados [Java]

Pessoal estou com um problema realizando uma busca com criteria. Utilizo ela pra fazer a paginação e trabalho com ela em cima de uma entidade.

Pois bem, tenho 3 tabelas.

Boletim

  • idBoletim
  • List listaBoletim

BoletimFato

  • idBoletimFato
  • FKBoletim
  • FKFato

Fato

  • idFato
  • descricao

1-N N- 1

Utilizo o criteria em cima de Boletim fato para montar minha paginação de 10 em 10 e utilizo um filtro para fazer consultar utilizando Restrictions do criteria, nesse caso utilizando um alias para acessar o fkBoletim da tabela BoletimFato e recuperar os dados especificos da tabela Boletim.

O problema é que, a tabela Boletim fato pode possuir registros do tipo
idBoletimFato | fkboletim | fkFato
1 ------------------------ 1 ------ 1
2-- ----------------------- 1 ------ 4

Ou seja como minha consulta é feita na tabela BoletimFato eu recupero boletins repetidos, sendo que eu so precisaria recuperar 1 boletim com seus fatos(Onde eu ja consigo recuperar os N fatos de um boletim na view normalmente).

Verifiquei em alguns foruns o uso de projections.distinct para fazer em cima da chave FkBoletim da tabela BoletimFato e trazer apenas registros unicos em cima da fkBoletim, porém retorna erro. Acredito que acho que por fazer referencia a um objeto e não a um Id eu nao consigo trazer os registros sem ser duplicados.

Veja se um desses exemplos ajudam a te dar uma direção: https://stackoverflow.com/questions/10731723/how-to-add-distinct-in-hibernate-criteria/15259497

1 curtida

O distinct que eles usam é em cima da tabela que se está trabalhando, como na minha tabela nao tem nenhum registro repetido usando o Criteria.DISTINCT_ROOT_ENTITY não vai fez diferença . O problema é que quero fazer o distinct em cima de uma FK dentro dessa tabela, onde ela se repete. e passando como session.createCriteria(Test.class).setProjection(
Projections.distinct(Projections.property(“fkboletim”)));

por exemplo , não consegue-se fazer o distinct

Então o que você está retornando não está duplicado, você deve escolher uma das linhas, pode usar funções de agregação e group by. Se está querendo retornar somente o campo fk, ai faz mais sentido, mas terá que retornar somente este campo e não os outros.

O que está retornando na pesquisa em relação a tabela Boletim fato está correto , pois os idBoletim fato nunca se repetem por se auto incremento, so que cada registro desse tem um FkBoletim que pode repetir , sendo assim ele trás por exemplo 5 registros de BoletimFato, só que 4 deles tem o mesmo FKboletim, e isso eu queria limitar em trazer em vez de 5 registros, trazer so 2( 1 que seria de fkboletim ja que os demais repetem) e o outro que restou com fkboletim diferente.

Ou seja apesar de ter 5 registros nessa tabela que estou trabalhando recuperaria apenas 2. Usando o distinct em cima de fkboletim da erro.

Não tem mágica, se um dos campos da sua query não traz valores repetidos, não tem como distinct funcionar. Se esse campo autoincremento não for relevante pro usuário, faz a query somente com os campos necessários, assim o distinct vai funcionar. Fora isso, terá que escolher uma das linhas com alguma condição, como por exemplo usando funções de agregação e group by.

O importante é partir do que o usuário precisa, assim evita obstáculos desnecessários. O próprio Criteria já é um obstáculo, via SQL diretamente seria muito mais prático.

1 curtida