Distinct no Hibernate

3 respostas
R

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;
	}

3 Respostas

utluiz

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

R

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.

utluiz

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.

Criado 25 de setembro de 2012
Ultima resposta 25 de set. de 2012
Respostas 3
Participantes 2