Left join Fetch Hibernate2

Pessoal me ajudem por favor, Tenho o seguinte código: session = factory.openSession(); tx = session.beginTransaction(); Query q = session.createQuery( "from TituloWeb as titulo " + "left outer join fetch titulo.parcelas " + "where titulo.numeTituWeb = :numeTituWeb "); q.setParameter("numeTituWeb", numeTitu); titulo = (TituloWeb)q.list().get(0);

e meu mapping é o seguinte [code]<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.simplestec.mercantil.dados.titulos.TituloWeb" table="Titulos_Web">
<id name="numeTituWeb" column="Nume_Titu_Web" type="string">
<generator class="assigned"/>
</id>

    &lt;bag name=&quot;parcelas&quot; lazy=&quot;true&quot; cascade=&quot;all&quot; inverse=&quot;true&quot; outer-join=&quot;true&quot;&gt;
        &lt;key column=&quot;Nume_Titu_Web&quot;/&gt;
        &lt;one-to-many class=&quot;com.simplestec.mercantil.dados.titulos.parcelas.Parcela&quot;/&gt;
    &lt;/bag&gt;
    
    &lt;property name=&quot;codiInst&quot; column=&quot;Codi_Inst&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;codiCont&quot; column=&quot;codi_Cont&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;codiImov&quot; column=&quot;codi_Imov&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;codiPess&quot; column=&quot;codi_Pess&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;periRefe&quot; column=&quot;peri_Refe&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;codiTipo&quot; column=&quot;codi_Tipo&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;valoImpo&quot; column=&quot;valo_Impo&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoMult&quot; column=&quot;valo_Mult&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoJuro&quot; column=&quot;valo_Juro&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoCorr&quot; column=&quot;valo_Corr&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoTota&quot; column=&quot;valo_Tota&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;numeDocu&quot; column=&quot;nume_Docu&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;codiSitu&quot; column=&quot;codi_Situ&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;matrUsua&quot; column=&quot;matr_Usua&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;flagTitu&quot; column=&quot;flag_Titu&quot; type=&quot;string&quot;/&gt;
&lt;/class&gt;

&lt;class name=&quot;com.simplestec.mercantil.dados.titulos.ProximoTituloWeb&quot; table=&quot;Proximo_Titulo_Web&quot;&gt;
    &lt;id name=&quot;proxTitu&quot; column=&quot;Prox_Titu&quot; type=&quot;string&quot;&gt;
        &lt;generator class=&quot;assigned&quot;/&gt;
    &lt;/id&gt;

&lt;/class&gt;    

&lt;class name=&quot;com.simplestec.mercantil.dados.titulos.parcelas.Parcela&quot; table=&quot;Parcelas_Web&quot;&gt;
    &lt;composite-id &gt;
        &lt;key-many-to-one name=&quot;titulo&quot;  class=&quot;com.simplestec.mercantil.dados.titulos.TituloWeb&quot; column=&quot;Nume_Titu_Web&quot;/&gt;
        &lt;key-property name=&quot;numeParcWeb&quot; column=&quot;nume_Parc_Web&quot;/&gt;
		&lt;generator class=&quot;assigned&quot;/&gt;
    &lt;/composite-id&gt;
    
    &lt;property name=&quot;valoImpo&quot; column=&quot;valo_Impo&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoMult&quot; column=&quot;valo_Mult&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoJuro&quot; column=&quot;valo_Juro&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valorCorr&quot; column=&quot;valor_Corr&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;valoTota&quot; column=&quot;valo_Tota&quot; type=&quot;double&quot;/&gt;
    &lt;property name=&quot;dataVenc&quot; column=&quot;data_Venc&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;codiSitu&quot; column=&quot;codi_Situ&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;dataPaga&quot; column=&quot;data_Paga&quot; type=&quot;string&quot;/&gt;
    &lt;property name=&quot;numeTitu&quot; column=&quot;nume_Titu&quot; type=&quot;string&quot;/&gt;
    
&lt;/class&gt;    

</hibernate-mapping>[/code]

Como se percebe tenho um relacionamento one-to-many onde um TituloWeb possui várias parcelas. Quando executo o código é lançada a seguinte exceçao:

net.sf.hibernate.QueryException&#58; in expected&#58; titulo.parcelas &#91;from com.simplestec.mercantil.dados.titulos.TituloWeb as titulo left outer join fetch titulo.parcelas where titulo.numeTituWeb = &#58;numeTituWeb &#93; at net.sf.hibernate.hql.FromParser.token&#40;FromParser.java&#58;92&#41; at net.sf.hibernate.hql.ClauseParser.token&#40;ClauseParser.java&#58;73&#41;

Alguem sabe onde está o erro? a sintaxe do “left outer join fetch” está correta? Minha base eh SQLServer, ela suporta esse tipo de operação?

Agradeço

aparentemente está certo, vc está usando o fetch para inicializar as parcelas de TituloWeb…

deveria funcionar…

vc consegue inserir uma parcela?

no seu mapping vc nao definiu uma classe para o composite id;

&lt;composite-id &gt; &lt;key-many-to-one name=&quot;titulo&quot; class=&quot;com.simplestec.mercantil.dados.titulos.TituloWeb&quot; column=&quot;Nume_Titu_Web&quot;/&gt; &lt;key-property name=&quot;numeParcWeb&quot; column=&quot;nume_Parc_Web&quot;/&gt; &lt;generator class=&quot;assigned&quot;/&gt; &lt;/composite-id&gt;

eu sempre fiz assim:

especificando o nome e a classe

Consigo inserir tudo normal, sem problemas! Mas será que o problema da consulta eh pq nao defini uma classe para o chave composta?
Poderias me dar umas dicas de como fazer esta chave composta?

vc precisa criar a classe ParcelaPK que é a qual vc declarou no mapping file.

Esta classe precisa implementar Serializable. e deve conter os dois atributos que estao declarados na tag <composite-id>, TituloWeb e numeParcWeb. Sua CompositePK é uma classe a parte que só contem get/set para os campos que formam o composite-id.

Depois na classe parcela o seu id será assim:

private ParcelaPK pk;

basicamente isso. Eu sempre uso o CodeGenerator do Hibernate para gerar as classes. Assim vc sempre descobre se o mapeamento está certo, e vc pode fazer miséria no mapeamento que o CodeGenerator gera as classes de uma forma super eficiente. Neste caso o CodeGenerator mesmo cria a ParcelaPK para você :smiley:

Valeu pela dica. Eu tava “brigando” com o middlegen, mas como o que eu tenho q fazer (por enquanto) é simples resolvi fazer na mão mesmo.

Mas onde eu acho o CodeGenerator, ele é mais simples que o midlegen? 8)

é um download a parte que vc faz do hibernate. O CodeGenerator, assim como o SchemaExport e o SchemaUpdate fazem parte do Hibernate Extensions. faça o download do “hibernate-ext”

CodeGenerator: gera código java a partir de XML
SchemaExport: exporta as tabelas para o banco a partir de XML
SchemaUpdate: atualiza as tabelas
MapGenerator: gera o arquivo de mapeamento a partir de uma classe Java (este não é tão fiel)

antigamente o Hibernate Extensions tinha um utilitário para criar mappings a partir do banco. Mas este projeto parou, sendo que o Middlegen veio para suprir esta necessidade.

sobre como utilizar veja na documentação.
http://www.hibernate.org/hib_docs/reference/html/toolsetguide.html#toolsetguide-s2

To quebrando a cabeça …

Implementei o ParcelaPK e ta tudo funcionando beleza a não ser a tal consulta com fetch …

o erro é o mesmo? sem o fetch funciona?

e coloque o hibernate.show_sql=true para vc ver o sql que ele está gerando, assim vc testa o sql e pode ter uma idéia pq nao está funcionando.

tente usar o hibern8ide para testar as queries…

O erro é o mesmo e sem o fetch funciona normal, consigo fazer joins normalmente. Quanto ao show_sql ele não chega nem a gerar o sql. É como se fosse um erro de sintaxe.

Acho q vou fazer da forma tradicional mesmo …

Valeu pela ajuda 8)