Boa tarde galera, tudo bom?
Tenho uma dúvida em uma busca de uma criteria no Hibernate:
Tenho uma entidade_pai uma lista de entidades_filhas em um relacionamento @ManyToMany.
Gostaria de buscar todos os pais dados os filhos.
Por exemplo:
[code]@Entity
public class Pedido {
@ManyToMany
public class Set<Produto> produtos;
}[/code]e tenho o relacionamento bi-direcional, ou seja:
[code]@Entity
public class Produto {
@ManyToMany
public class Set<Pedido> pedidos;
}[/code]Agora, imagine que eu tenho uma listagem de todos os produtos em uma view qualquer.
Então eu seleciono determinados produtos.
Em seguida, preciso listar todos os pedidos que possuam os produtos selecionados.
Eu tentei:session.createCriteria(Pedido.class)
.criteria.add(Restrictions.in("produtos", listaDeProdutosSelecionadosNaView))
.list();
Porém o sql gerado não está correto.
Qual seria a criteria mais adequada para esse cenário?
Agradeço antecipadamente e fico no aguardo.
poste na tag Code
QUando a tabela eh @ManyToMany o relacionamento tem que ser bilateral
ou seja
tem que ter um Set na tabela Pedido referenciando produtos, e um set na tabela produtos referenciando
peditos.
pelo que eu entendo de hibernate, o modo mais facil de fazer uma consulta eh da seguinte maneira
se você tem a PK da classe pedido faaz assim:
Pedido pedido = (Pedido) session.get( Pedido.class , 1);//1 eh a sua PK
Set <Produto> produto = pedido.getCollectionProduto();
//a mesma coisa para a classe produto--->pedido
espero ter ajudado
Ola @jperondi.
Muito obrigado pela resposta e pela atenção.
Por favor, me desculpe. Já corrigi a minha pergunta, utilizando a tag code.
Bom, no meu caso eu não tenho a PK de Pedido. O que eu tenho, é uma lista de produtos. E a partir dessa lista de produtos, eu preciso obter todos os pedidos que os referenciam.
Gostaria de tentar fazer isso de uma só vez, sem iteração.
Alguma sugestão?
Agradeço mais uma vez, e fico no aguardo.
Salve, salve, turma do GUJ.
Por enquanto, tive que apelar pro HQL.
Ficou mais ou menos assim:[code]final String hql = “select distinct§ from Pedido as p inner join p.produtos as pr where pr.id in (:ids)”;
return this.session.createQuery(hql)
.setParameterList(“ids”, idsDosProdutosSelecionadosNaView)
.list();
[/code]Se alguém souber como fazer essa query em criteria, ou referencias para situações similares, eu apreciaria.
Agradeço mais uma vez.
Um abraço,
Rogério,
Tente fazer a criteria assim:
Criteria cri = session.createCriteria(Pedido.class);
cri.createCriteria("produtos").add(Restrictions.in("id", listIdProdutos)).
setResultTransformer(cri.DISTINCT_ROOT_ENTITY);
Aeeeew Brunaaaao!
Valeu pelo HELP brodi!
Ow, foi quase perfeito. \o/ O único problema é que a sql gerada não tem o distinct. Mesmo setando o setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Oia um resumo formatado da sql gerada:
[code]
select
this_.id as id2_8_,
produto.id as id14_4_,
from
Pedido this_
inner join
PedidoProduto pedidoProduto
on this_.id = pedidoProduto.pedido_id
inner join
Produto produto
on pedidoProduto.produtos_id = produto.id
where
produto.id in (
?, ?, ?
)[/code]O ruim nesse caso, é que se um pedido tiver 2 produtos buscados, o pedido estará na lista 2 vezes.
Alguma outra sugestão?
Muito obrigado pela atenção e pela ajuda! ^^
PS: A saber, produto e pedido são fictícios, ok? Aki as entidades são outras! ;D
PPS: Bora pro EA2010?
Parece que não tem como fazer mesmo.
Uma possibilidade é adicionar uma projection na Criteria porém só retornaria a lista de Ids do pedido e não uma lista objetos Pedido.
Você poderia usar essa lista de Ids em uma segunda Criteria pra retornar os objetos.
cri.setProjection(Projections.distinct( Projections.property( "id" )));
Existe uma thread aberta no projeto hibernate solicitando essa feature do Distinct na Criteria
http://opensource.atlassian.com/projects/hibernate/browse/HB-520