Aplicando a cláusula Left Outer Join no Hibernate

Pessoal, tenho 2 tabelas:

  • Categorias (id_categoria, descricao)
  • SubCategorias (id_subcategoria, is_categoria, descricao)

Tenho 2 entidades:
CategoriasModel (contendo um set)
SubCategoriasModel (contendo uma referencia p/Categorias)

Os hbms estão td ok.

Imaginem q eu tenho os seguintes registros:

  • EDUCAÇÃO (categorias)
    • Universidade (subcategorias)
    • Pós-Graduação
  • ALIMENTAÇÃO
    • Supermercado
    • Restaurante
    • Padaria
  • AUTOMÓVEL
    • não tem nada

Preciso fazer um SELECT que me retorne todas as categorias independente se tem registros ou não na tabela subcategorias, ou seja:

select  cat.*, sub.* from CATEGORIAS cat 
LEFT OUTER JOIN 
SUBCATEGORIAS sub 
ON
cat.ID_CATEGORIA=sub.IS_CATEGORIA

Tentei fazer isto de várias formas usando o hibernate e não obtive sucesso, meu maior problema é que tenho 2 entidades, porém na hora de recuperar o valor de retorno da list, o Java não sabe qual é o tipo que deve retornar (se é CategoriasModel ou SubCategoriasModel)…O grande lance é que usando o código abaixo eu consigui retornar alguma coisa, porém pelo fato da chave fk do SubCategorias estar nula eu não consigo recuperar este objeto…

Enfim, alguém pode me dar alguma dica sobre isto…

Abaixo segue os exemplos:


    List lista = getSession().createQuery(
    "from CategoriasModel as cat left join fetch cat.subcategorias")
    .list();
  
   List lista2 = getSession().createQuery(
   "from SubCategoriasModel as subcat right join fetch   
     subcat.categoriaModel")
        .setFirstResult(getPos())
        .setMaxResults(maxRegistros)
        .list();

	    
    List lista3 = getSession().createSQLQuery(
    "select {c.*}, {s.*} from GF_CATEGORIAS as c LEFT   
     OUTER JOIN GF_SUBCATEGORIAS as s"+
     " ON c.id_Categoria=s.is_Categoria")
     .addEntity("c",CategoriasModel.class)
     .addEntity("s",SubCategoriasModel.class)
     .list();
package farsoft.tabelas.categorias.model;

import java.io.Serializable;
import java.util.Set;

public class CategoriasModel implements Serializable {

	private int idCategoria;
	private String descricao;    
	private String tipoOperacao;
	private Set subcategorias;	
	 
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getIdCategoria() {
		return idCategoria;
	}

	public void setIdCategoria(int idCategoria) {
		this.idCategoria = idCategoria;
	}

	public String getTipoOperacao() {
		return tipoOperacao;
	}

	public void setTipoOperacao(String tipoOperacao) {
		this.tipoOperacao = tipoOperacao;
	}
	public Set getSubcategorias() {
		return subcategorias;
	}
	public void setSubcategorias(Set subcategorias) {
		this.subcategorias = subcategorias;
	}
}

package farsoft.tabelas.subcategorias.model;

import farsoft.tabelas.categorias.model.CategoriasModel;


public class SubCategoriasModel {

	private int idSubCategoria;
	private String descricao;
	private int isCategoria;
	
	private CategoriasModel categoriaModel;
	
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public int getIdSubCategoria() {
		return idSubCategoria;
	}
	public void setIdSubCategoria(int idSubCategoria) {
		this.idSubCategoria = idSubCategoria;
	}
	public int getIsCategoria() {
		return isCategoria;
	}
	public void setIsCategoria(int isCategoria) {
		this.isCategoria = isCategoria;
	}
	public CategoriasModel getCategoriaModel() {
		return categoriaModel;
	}
	public void setCategoriaModel(CategoriasModel categoriaModel) {
		this.categoriaModel = categoriaModel;
	}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="farsoft.tabelas.categorias.model">

	<class name="CategoriasModel"
		table="GF_CATEGORIAS">

		<id name="idCategoria" column="ID_CATEGORIA" unsaved-value="null">
	<generator class="increment"/>
		</id>

     	<property name="descricao" column="DESCRICAO" length="40"/>
		<property name="tipoOperacao" column="TIPO_OPERACAO" length="1"/>

         <set name="subcategorias" cascade="none" lazy="true">
            <key column="IS_CATEGORIA" />
            <one-to-many class="farsoft.tabelas.subcategorias.model.SubCategoriasModel" />
        </set>   


	</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="farsoft.tabelas.subcategorias.model">

	<class name="SubCategoriasModel"
		table="GF_SUBCATEGORIAS">

		<id name="idSubCategoria" column="ID_SUBCATEGORIA" unsaved-value="null">
 	<generator class="increment"/>
		</id>

     	<property name="descricao" column="DESCRICAO" length="40"/>
		<property name="isCategoria" column="IS_CATEGORIA" insert="false" update="false"/>

        <many-to-one name="categoriaModel" column="IS_CATEGORIA" class="farsoft.tabelas.categorias.model.CategoriasModel"/>

	</class>
</hibernate-mapping>

1 - O q ele retorna nas consultas q vc cita como exemplo?

2 - O q acontece quando vc tenta fazer a consulta em CATEGORIAS sem o LEFT JOIN?

3 - Jah tentou usar HQL?

Query q = session.createQuery("from Categoria"); List result = q.list();

Abraço.

Ele me retorna uma lista c/ os seguintes valores:

ID1_0_   ID1_1_   DESCRICAO3_0_   TIPO3_3_9_  DESCRICAO4_1_           IS3_4_1_  IS2_0__  ID1_0__  
  1        7      CONTRATOS          C        EMPRESA EM POUSO ALEGRE    1        1          7   
  1        7      CONTRATOS          C        EMPRESAS EM SÃO PAULO      1        1          8  
  1        7      SALÁRIO            C        <null>                   <null>   <null>    <null>            8

O lance é que o JAVA fica perdido sem saber o tipo do objeto…na verdade ele pega o tipo CategoriasModel ou SubCategoriasModel…mas não deixa eu dar um CAST…

[quote=“Taz”]1 - O q ele retorna nas consultas q vc cita como exemplo?

2 - O q acontece quando vc tenta fazer a consulta em CATEGORIAS sem o LEFT JOIN?

3 - Jah tentou usar HQL?

Query q = session.createQuery("from Categoria"); List result = q.list();

Abraço.[/quote]