Hibernate - Left join com clausula on

Prezados,

Estou precisando do seguinte:

select new Produto (t.id, t.codigo, t.descricao,
t.grupoProduto.descricao, um.abreviacao, tp.descricao, om.codigo, st.codigo)
from Produto t
left join t.unidadeMedida as um
left join t.tipoProduto as tp
left join t.produtoEmpLazy as pe
left join pe.origemMercadoria as om
left join pe.situacaoTributaria as st
controlerHQL.WHERE + " order by t.descricao

O left join em destaque acima eu precisa que tivesse uma clausa-la condicional

algo assim: left join t.produtoEmpLazy as pe on pe.empresa = :empresa

So que isso noa funciona no hibernate. Sabem como podsso fazer isso?

O resultado final teria que ser: left outer join tipoproduto t on t.empresa = 1

[]'s

Vc estah confundindo as coisas, cláusula condicional eh WHERE, LIMIT, entre outos. entao para fazer um filtro vc precisa compara-lo numa cláusula WHERE ex:

WHERE pe.empresa = :empresa 

O ‘ON’ eh um operador que trabalha em conjunto com as operações de junção de tabela. Se eu não me engano na hql nem precisa usá-lo ela jah faz isso internamente.

vc precisa usar @SecondayTables

para definir as tabelas secundarias de seu objeto…

de uma olhada nessa anotação, la tem tudo q vc precisa, pra fazer a ligação antre sua tabela principal e a secundaria…

Obrigado pela dica.

Ja descobri a solução

posso usar a seguinte sintaxe left join tipoProduto as tp with tp.empresa.id = :idEmpresa

[]'s Miguel :smiley:

[quote=Marcos Alexandre Miguel]Obrigado pela dica.

Ja descobri a solução

posso usar a seguinte sintaxe left join tipoProduto as tp with tp.empresa.id = :idEmpresa

[]'s Miguel :smiley:
[/quote]

so que dessa forma como vc ta fazendo, vc ta deixando de fazer OO, e o bom do hibernate, é esquecer esse HQL e esse SQL

se seu objeto produto ja estiver mapeado… e vc so quiser motnar a pesquisa… fica bem facill

public List<Produtos> findByEmpresa(Empresa empresa,Session session) { return session.createCriteria() .forClass(Produto.class) .add(Restrictions.eq("produtoEmpLazy", empresa)) .list(); }

ai vc pode usar em outro lugar assim

Session session = getSession(); List<Produto> produtos = findByEmpresa(minhaEmpresa, session);

Obrigado a todos pela prontidão.

Consegui resolver o problema.

[]'s Miguel

Existe alguma outra forma de obter o mesmo resutlado, usando DetachedCriteria ou Criteria porem sem usar o @SecondaryTables ???
Estou com esse mesmo problema

DetachedCriteria criteria = DetachedCriteria.forClass(Remessa.class,"Remessa");
criteria.createAlias("Remessa.repasses", "Repasses",CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("Remessa.id", idRemessa));
criteria.getExecutableCriteria(hibernateSession).uniqueResult();

Precisaria de adicionar um and Remessa.situacao <> ‘E’ no left outer join

alguma ideia??