Distinct no Hibernate

Pessoal tenho a classe de pesquisa abaixo, onde estou buscando as amostras de uma solicitação, onde a amostra é chave estrangeira da tabela de solicitação. Estou exibindo os dados em uma tabela e esta listando as amostra duplicada pq para a mesma amostra tenho mais de um elemento ligado a ela. Gostaria de saber como fazer no caso para listar as amostras sem duplicar. Acredito que o distinct resolva mas tentei usa-lo e sem sucesso. Alguem ajuda??


public List<SolicitacaoDeterminacao> buscarAmostraPorSolicitacao(
			Integer solicitacao) {

		List<SolicitacaoDeterminacao> listaRetorno = null;

		try {

			Session session = HibernateUtil.getSessionFactory().openSession();

			Criteria criteria = session
					.createCriteria(SolicitacaoDeterminacao.class);

			criteria.createAlias("solicitacao", "s");
			criteria.add(Restrictions.eq("s.codigo", solicitacao));
			criteria.addOrder(Order.asc("s.codigo"));
			
			listaRetorno = (List<SolicitacaoDeterminacao>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaRetorno;
	}

Bom dia, renanlalier.

No momento não tenho como testar o código, mas vc já tentou algo assim?

fonte: http://stackoverflow.com/questions/300491/how-to-get-distinct-results-in-hibernate-with-joins-and-row-based-limiting-pagi

Bom dia Luiz.

Tinha tentando usar da seguinte forma, porém não funcionou:


criteria.setProjection(Projections.distinct(Projections.property("s.id_amostra")));

da o erro:

org.hibernate.QueryException: could not resolve property: id_amostra of: to.SolicitacaoDeAnalise

Tentei da forma que você citou, não funcionou, não entendi nesse caso como que o criteria entende que é para fazer o distinct na chave estrangeira. To meio perdido em relação a isso cara…rsrs…

Valeu.

Estava relendo melhor seu post inicial para tentar entender melhor a questão.
Vou traduzir em pseudo-SQL pq acho mais fácil entender. Basicamente o que o código inicial faz é:

Para recuperar as amostras em questão, sem duplicidade, o DINTINCT resolveria.
No caso, não tenho certeza de como fazer isso no hibernate. Talvez consiga fazer uns testes mais tarde.
Algumas sugestões, entretanto, são:

  • “id_amostra” é o nome do campo no BD ou é o nome do atributo? Se for o nome do campo, tente especificar o nome do atributo no parâmetro do Projections.
  • O distinct geralmente leva em consideração todos os campos selecionados, tente selecionar apenas o campo que precisa, no caso, o código da amostra e talvez o Projections funcione.

Por outro lado, uma forma mais “natural” em termos de SQL, sem o uso de distinct, seria:

Explicando: selecione todas as amostras que existam na tabela SolicitacaoDeterminacao após filtrar pelo código de solicitação.
Se entendeu, você pode tentar tradudir isso usando Criteria ou HQL.