GARANTIR DESCONTO

Fórum Distinct não funciona #388497

14/10/2010

0

Boa Tarde.   Estou tentando fazer uma consulta, essa consulta se tornará uma lista e será visualizada em uma combo.   estou fazendo essa consulta:   @SuppressWarnings("unchecked") public List<Negociacao> listarAgrupar2(Integer isnSolicitacao) { EntityManager em = JPAResourceBean.getEntityManager(); Query q = em.createQuery("select distinct(neg.cotacaoItem.solicitacaoFornecedor.solicitacao) from Negociacao neg where neg.cotacaoItem.solicitacaoFornecedor.solicitacao.isnSolicitacao = :isnSolicitacao"); q.setParameter("isnSolicitacao", isnSolicitacao); return q.getResultList(); } pela lógica do hibernate deveria funcionar, mas não funciona. Alguém teria uma sugestão? preciso muito dessa distinct.   Atenciosamente, Ricardo Barcelos.
Barcelos.java

Barcelos.java

Responder

Posts

14/10/2010

Davi Costa

Ricardo,
vc está usando Hibernate?
Se tiver e vc refazer essa consulta com Criteria não vai ter problema algum. Vai funcionar tranquilo.
Mas se tiver usando somente JPA, acredito que a versão 2.0 já tem sua implementação do Criteria,
mas não sei como fazer. Dá um toque se tiver usando Hibernate, caso estiver e precise posso até postar um código de exemplo aqui.

Att Davi
Responder

Gostei + 0

14/10/2010

Barcelos.java

Boa tarde. Estou usando o hibernate sim, tentei utilizar o criteria mas ainda não conheço muito bem.   Desde já agradeço a ajuda.  
Responder

Gostei + 0

14/10/2010

Davi Costa

Para ganhar tempo vou te postando logo. Seria algo assim:

Criteria criteria = session.createCriteria( MyEntity.class ); 
criteria.setProjection( Projections.distinct( Projections.property( "id" ) ) ); 

Na documentação do Hibernate também achei :
select distinct cat.name from Cat cat

Muito parecido com o q vc fez mas tirando os parênteses.

Testa aí e depois manda o feedBack

Att Davi


Responder

Gostei + 0

14/10/2010

Barcelos.java

Davi é o seguinte.   eu não sei como se comporta o criteira quando se trata de EntityManager.  EntityManager em = JPAResourceBean.getEntityManager();   queria saber tambem como passo um parametro como o que está abaixo: q.setParameter("isnSolicitacao", isnSolicitacao); e quanto a questão do session, como inicializo este na minha consulta.   se vc tiver um criteria similar a esta consulta já vai ajudar muito.   Atenciosamente, Ricardo Barcelos.
Responder

Gostei + 0

14/10/2010

Davi Costa

Ok.

Criteria criteria = ((Session)entityManager.getDelegate()).createCriteria(Negociacao.class);
criteria.setProjection( Projections.distinct( Projections.property( "solicitacao" ) ) ); 
criteria.add(Restrictions.eq("solicitacao", isnSolicitacao));

O problema é que como esse atributo não é diretamente da entidade Negociacao vc vai ter adicionar outros criterias, o que ficaria mais ou menos assim:


Criteria criteria = ((Session)entityManager.getDelegate()).createCriteria(Negociacao.class);
Criteria cotacaoCriteria = criteria.createCriteria("cotacaoItem");
Criteria solicitacaoCriteria = cotacaoCriteria.createCriteria("solicitacaoFornecedor");
solicitacaoCriteria.setProjection( Projections.distinct( Projections.property( "solicitacao" ) ) ); 
solicitacaoCriteria.add(Restrictions.eq("solicitacao", isnSolicitacao));

e no fim do método retorna:

return criteria.list();

Para maiores dúvida dá uma olhada na documentação:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

Espero ter ajudado e só por desencargo de consciência dá uma testada naquele hql que passei do distinct
sem os parênteses como havia falado p ver se funciona tb.

Att Davi


Responder

Gostei + 0

14/10/2010

Barcelos.java

Olá Davi.   aquele que vc me enviou funciona, mas não sei o que acontece que quando começo a navegar pelos objetos(propriedades) o distinct não funciona com deveria.   vou testar esse código que vc enviou e jajá te dou um retorno.   ATT.: R.BARCELOS
Responder

Gostei + 0

14/10/2010

Davi Costa

Hm,

cara acredito então para o caso do distinct, tenha que ser feito o select diretamente na entidade
que possui o atributo, ou seja, a partir do relacionamento das tuas entidades fazer um outro select que atenda a sua necessidade, trazendo as negociações a partir do solicitacaoFornecedor.
Mas tranquilo, testa o código que passei dá uma olhada na documentação para entender o que acontece (não custa nada e é mais aprendizado) e manda o feedBack.

Att Davi
Responder

Gostei + 0

15/10/2010

Barcelos.java

Boa tarde Davi.   Quando tentei pecorrer muitos objetos percebi que o distinct não é tão funcional, porém quando  Simplifiquei a consulta a uma tabela única, o distinct funcionou.   Além do Criteria, estou estudando novas maneiras dessa função(distinct) funcionar quando desço varios relacionamentos, porém já consegui fazer a pesquisa, mas quando tiver alguma noticia sobre esse assunto posto aqui no forum.   no mais.   encerro aqui esse chamado.   Atenciosamente, Ricardo Barcelos.
Responder

Gostei + 0

15/10/2010

Davi Costa

Beleza Ricardo.

Posta mesmo caso vc descubra uma forma melhor de usar o distinct.
Só mais uma dica, quando estamos usando o criteria podemos usar query nativa do próprio banco.
Sempre que o hibernate não atende minha consulta (o que honestamente é muito difícil - só passei por isso uma vez) eu apelo para native query. Dá uma pesquisada nisso. Simplesmente é mais uma restrição que usamos e ele espera uma String como parâmetro que justamente o sql nativão mesmo do seu banco de dados para ele e ele executa o select. Agora temos que ter um pouco de cuidado, como até já falei aqui em outras threads, o grande lance do Hibernate é deixar sua aplicação multi banco, se vc usar alguma função muito específica do seu banco como tem o postgres, o oracle... sua aplicação vai ficar amarrada para esse determinado banco. Mas temos aí o SQL ANSI que roda em todos  os bancos, então sempre buscamos usar SQL ANSI para continuar deixando nossa aplicação multi banco, algumas vezes vai ser difícil, mas pelo menos temos q estar cientes de que se mudar de banco temos que refatorar um pouco a aplicação.

Abraço
Responder

Gostei + 0

19/10/2010

Dyego Carmo

Gostei da dica !

eu tmb utilizaria query nativa se o hibernate em nao ajudasse na hora de realizar um select :)

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar