Distinct não funciona
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
Curtidas 0
Respostas
Davi Costa
14/10/2010
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
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
GOSTEI 0
Barcelos.java
14/10/2010
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.
GOSTEI 0
Davi Costa
14/10/2010
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
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
GOSTEI 0
Barcelos.java
14/10/2010
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.
GOSTEI 0
Davi Costa
14/10/2010
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
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
GOSTEI 0
Barcelos.java
14/10/2010
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
GOSTEI 0
Davi Costa
14/10/2010
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
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
GOSTEI 0
Barcelos.java
14/10/2010
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.
GOSTEI 0
Davi Costa
14/10/2010
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
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
GOSTEI 0
Dyego Carmo
14/10/2010
Gostei da dica !
eu tmb utilizaria query nativa se o hibernate em nao ajudasse na hora de realizar um select :)
eu tmb utilizaria query nativa se o hibernate em nao ajudasse na hora de realizar um select :)
GOSTEI 0