Ajuda em Consulta Criteria

6 respostas
O

Ola pessoal, estou aqui denovo.
Eu tinha postado antes uma duvida a respeito de uma consulta em HQL obtive dicas para usar Criteria, mas, mesmo assim nao esta retornando o que eu preciso.
Tenho uma relacao de entities dessa forma:
Pregao x Proposta = one-to-many x many-to-one
Proposta x Lance = one-to-many x many-to-one
Lance x Lote = many-to-one

Tenho que efetuar uma consulta que me traga do banco a seguinte questao:
Todas pregoes com as propostas que tem seu menor lance em um lote. Ou seja eu tenho que efetuar um join entre a entidade Proposta com Pregao, Proposta com Lance, e Lance com Lote, aqui eu pego o menor valor do lance em seu lote. Tentei dessa form:

List<Proposta> listaProposta = session.createCriteria(Proposta.class)
										.createAlias("pregao", "pregao")
										.createAlias("lance", "lance")
										.setProjection(Projections.projectionList()
										.add(Projections.min("lance.valor"))
										.add(Projections.groupProperty("pregao"))
										.add(Projections.groupProperty("lance")))
										.list();

Ela me retornou o menor valor do lance e o pregao. Tinha que retornar o menor valor do lance em cada lote, a entidade Lance dona desse lance, a entidade proposta detentora desse Lance e o Pregao que se encontra essa proposta. Desculpe pela insistencia mas tenho que entregar o sistema pronto do meu projeto de TCC da faculdade e o tempo esta bem curto.

Agradeco a ajuda e a compreensão de todos.

6 Respostas

B

Então você deveria agrupar por lote, e não por pregão.

O

Bruno.
Eu nao tenho uma relacao direta entre proposta e lote, por isso que nao posso fazer esse agrupamento.
Ele me retorna o menor lance geral, ao inves de se retornar o menor lance por cada lote de cada proposta.

List<Proposta> listaProposta = session.createCriteria(Proposta.class)
										.createAlias("pregao", "pregao")
										.createAlias("lance", "lance")
										.setProjection(Projections.projectionList()
										.add(Projections.min("lance.valor"))
										.add(Projections.groupProperty("pregao"))
										.add(Projections.groupProperty("lance")))
										.list();
B

Ah certo.

Que código você está usando p/ realizar o join entre essas duas tabelas distintas?

O

Eu criei um SQL e deu certo, mas queria usar criteria e nao SQL nativo. Veja a SQL:

select proposta.idProposta, pregao.idPregao, min(lance.valor), lote.idlote from Pregao pregao
inner join (Proposta proposta inner join 
(Lance lance inner join 
Lote lote on Lance.idlote = lote.idLote) 
on proposta.idProposta=lance.idProposta)
on pregao.idpregao=proposta.idPregao group by (proposta.idProposta,pregao.idPregao, lote.idlote)

Ele me retornou :
idProposta — idPregao ---- menorLance ---- idLote
1 ---------------- 1 ----------------- 29 -------------- 1
1 ---------------- 1 ----------------- 44 -------------- 2

Ela me retorna o menor lance de cada lote com a proposta e o pregao.

OBS: Desculpe mas nao consegui identar certinho essa resposta…

B

Você precisa da tabela de pregão? Se precisar só do id dele, você pode pegar o de proposta.idPregao.

O

Tudo bem. Como ficaria a Criteria entao?
Como eu dou um join entre entidades aninhadas? Tipo assim :

List<Proposta> listaProposta = session.createCriteria(Proposta.class)  
                                         .createAlias("pregao", "pregao")  
                                         .createAlias("lance", "lance") 
                                         .createAlias("lote", "lote") // Aqui tem a relacao entre lance e lote, mas nao com proposta 
                                         .setProjection(Projections.projectionList()  
                                         .add(Projections.min("lance.valor"))  
                                         .add(Projections.groupProperty("pregao"))  
                                         .add(Projections.groupProperty("lance")))  
                                         .list();

O hibernate retorna erro porque ele diz que a entidade Proposta nao tem o bean lote, mas a entidade Lance contem lote.
Pela Criteria é possivel aninhar Proposta com Lance e Lance com Lote?

Criado 13 de junho de 2008
Ultima resposta 13 de jun. de 2008
Respostas 6
Participantes 2