Inner join no Hibernate

Salvem,

 Eu preciso executar uma query como esta com o método Session.find() que tenha um join para outro objeto mas sem relação entre as entidades mapeadas no Hibernate.
 [code]
 select cid from Cidade as cid join Estado as est on (cid.codEstado = est.codEstado) where est.nomeEstado like 'M%'
 [/code]

 O Hibernate não consegue resolver o join por que eu não tenho uma referencia many-to-one entre Cidade e Estado. O problema é que eu não quero que Cidade tenha essa referencia a Estado, pois eu preciso deste join em poucos lugares e eu pagaria o preço de a referencia a Estado ser carregada junto com Cidade.
 Eu poderia fazer isso com SQL nativo, mas gostaria que fosse em HQL , senão eu teria que popular os campos de Cidade na mão e talvéz teria problemas se mudasse de banco (Interbase -> Oracle)

 A pergunta é : Como fazer um join entre objetos cuja relação não esteja mapeada em um hbm.xml ?

Voce pode colocar o relacionamento e marcar ele como lazy, ai o hibernate só vai carregar quando necessario.

Outra maneira é decompor a junção e usar produto cartesiano com seleção.

Isso significa então que não posso fazer um join usando HQL quando a relação entre os objetos não esteja documentada no hbm.xml, ou seja, estou lá no meu código e de repente preciso fazer um join entre um objeto mapeado para um objeto também mapeado, vou ter que ir lá no hbm.xml do primeiro objeto e criar um many-to-one ou one-to-one para o segundo objeto, daí ir no segundo e defini-lo como ‘lazy’.

Usando a notação que vc passou na sua segunda opção funciona:
  select cid from Cidade as cid , Estado as est where cid.codEstado = est.codEstado and est.nomeEstado like 'M%'
A minha maior preoculpação é com portabilidade entre bancos ( tão comentada pela comunidade Hibernate ) e não gostaria de ficar usando sintaxes exclusivas de um banco de dados, pois sei que esta sintaxe muda de banco para banco, principalmente em se tratando de JOIN.
Sendo assim acho a opção pelo lazy-load mais portável, apesar do desconforto que citei acima.
Gostaria de saber se vc concorda com isso e agradecer pela sua ajuda.

[quote=“CLAUDIO GUALBERTO”]
A minha maior preoculpação é com portabilidade entre bancos ( tão comentada pela comunidade Hibernate ) e não gostaria de ficar usando sintaxes exclusivas de um banco de dados, pois sei que esta sintaxe muda de banco para banco, principalmente em se tratando de JOIN.
Sendo assim acho a opção pelo lazy-load mais portável, apesar do desconforto que citei acima.
Gostaria de saber se vc concorda com isso e agradecer pela sua ajuda.[/quote]

Não sei te dizer se a imposibilidade de se fazer joins sem ser via relacionamentos é uma deficiencia ou decisão de design do hibernate. Conceitualmente não deveria existir tal necessidade por que seu Domain Model teria esses relacionamentos.

Usar produto cartesiano + seleção vai funcionar com qualquer banco que suporte jdbc e sql, nunca ouvi falar de um banco que isso não funcione. O exemplo que eu dei era em HQL puro, ou seja, o Hibernate garante a portabilidade.

Eu acho que é uma questão de gosto, usar relacionamentos com lazy load deixa as coisas mais faceis pro desenvolvedor, com HQL você vai estar certo de puxar somente o necessario.

Concordo com vc, o lazy-load não é problema. Mas imagine se eu quiser fazer um left join e o meu banco atual é Oracle, dai eu teria que colocar isso no WHERE:

 cid.codEstado = est.codEstado (+)

 Daí eu tenho que mudar de banco.... digamos MS Sql, como isso ficaria ? Eu teria que mudar todo o meu código ?

Necesse caso você está mudando de assunto. Eu falei de uma solução pra inner joins.

Então deixa ver se entendi… não temos uma solução portável para os outros tipos de join ?!

Sim, usar relacionamentos gerenciados pelo hibernate com lazy loading.

Que eu saiba o hibernate não suporta operações como união e complemento para queries, caso suporte é possivel.

De qualquer forma eu estou achando esse tópico todo muito sem sentido, por que alguem usaria hibernate mas não querendo usar dos recurso oferencidos os mais uteis e poderosos?

Leia o capítulo sobre tunning de relacionamentos, leia ate entender direito. Depois disso voce vai ver que não tem muito sentido oque voce está fazendo.

É que comecei a usar o Hibernate e ainda não estou acostumado com coisas que para vc podem parecer óbvias.
Em qual documentação encontro informações sobre tunning de relacionamentos ? na documentação que vem com o Hibernate não encontrei.