Left join Fetch Hibernate2

9 respostas
D
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
<?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>

        <bag name="parcelas" lazy="true" cascade="all" inverse="true" outer-join="true">
            <key column="Nume_Titu_Web"/>
            <one-to-many class="com.simplestec.mercantil.dados.titulos.parcelas.Parcela"/>
        </bag>
        
        <property name="codiInst" column="Codi_Inst" type="string"/>
        <property name="codiCont" column="codi_Cont" type="string"/>
        <property name="codiImov" column="codi_Imov" type="string"/>
        <property name="codiPess" column="codi_Pess" type="string"/>
        <property name="periRefe" column="peri_Refe" type="string"/>
        <property name="codiTipo" column="codi_Tipo" type="string"/>
        <property name="valoImpo" column="valo_Impo" type="double"/>
        <property name="valoMult" column="valo_Mult" type="double"/>
        <property name="valoJuro" column="valo_Juro" type="double"/>
        <property name="valoCorr" column="valo_Corr" type="double"/>
        <property name="valoTota" column="valo_Tota" type="double"/>
        <property name="numeDocu" column="nume_Docu" type="string"/>
        <property name="codiSitu" column="codi_Situ" type="string"/>
        <property name="matrUsua" column="matr_Usua" type="string"/>
        <property name="flagTitu" column="flag_Titu" type="string"/>
    </class>
    
    <class name="com.simplestec.mercantil.dados.titulos.ProximoTituloWeb" table="Proximo_Titulo_Web">
        <id name="proxTitu" column="Prox_Titu" type="string">
            <generator class="assigned"/>
        </id>

    </class>    
    
    <class name="com.simplestec.mercantil.dados.titulos.parcelas.Parcela" table="Parcelas_Web">
        <composite-id >
            <key-many-to-one name="titulo"  class="com.simplestec.mercantil.dados.titulos.TituloWeb" column="Nume_Titu_Web"/>
            <key-property name="numeParcWeb" column="nume_Parc_Web"/>
			<generator class="assigned"/>
        </composite-id>
        
        <property name="valoImpo" column="valo_Impo" type="double"/>
        <property name="valoMult" column="valo_Mult" type="double"/>
        <property name="valoJuro" column="valo_Juro" type="double"/>
        <property name="valorCorr" column="valor_Corr" type="double"/>
        <property name="valoTota" column="valo_Tota" type="double"/>
        <property name="dataVenc" column="data_Venc" type="string"/>
        <property name="codiSitu" column="codi_Situ" type="string"/>
        <property name="dataPaga" column="data_Paga" type="string"/>
        <property name="numeTitu" column="nume_Titu" type="string"/>
        
    </class>    
    
</hibernate-mapping>
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: in expected: titulo.parcelas [from com.simplestec.mercantil.dados.titulos.TituloWeb as titulo left outer join fetch titulo.parcelas where titulo.numeTituWeb = :numeTituWeb ]
        at net.sf.hibernate.hql.FromParser.token(FromParser.java:92)
        at net.sf.hibernate.hql.ClauseParser.token(ClauseParser.java:73)

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

9 Respostas

ricardolecheta

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

deveria funcionar…

ricardolecheta

vc consegue inserir uma parcela?

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

<composite-id > <key-many-to-one name="titulo" class="com.simplestec.mercantil.dados.titulos.TituloWeb" column="Nume_Titu_Web"/> <key-property name="numeParcWeb" column="nume_Parc_Web"/> <generator class="assigned"/> </composite-id>

eu sempre fiz assim:

especificando o nome e a classe

D

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?

ricardolecheta

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:

D

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)

ricardolecheta

é 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

D

To quebrando a cabeça …

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

ricardolecheta

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…

D

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)

Criado 6 de novembro de 2003
Ultima resposta 7 de nov. de 2003
Respostas 9
Participantes 2