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>