Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Encontrando uma tabela não mapeada

Estou tentando fazer um select em uma tabela "Imoveis" cujo relacionamento é many-to-many com" Cidadaos", durante o mapeamento foi criada uma terceira tabela usando a tag no mapeamento das duas anteriormente citadas, assim a tabela "Proprietários" surgiu na minha base, mas ela não foi mapeada e não consigo consultar o banco nesse código:

public IList<Cidadaos> BuscaPorImovel(int cod_imovel)
        {
            IQuery query = session.CreateQuery("from Proprietarios WHERE cod_imovel = :cod_imovel");
            query.SetParameter("cod_imovel", cod_imovel);
            return query.List<Cidadaos>();
        }

Nesse caso estou tentando obter uma lista de todos os Cidadãos que são proprietários de tal imóvel, como faço essa busca?

3 respostas

Olá Guilherme,

me manda o código das classes Imovel e Cidadao e também a classe com o mapeamento da Propriedade, por favor? Ai acho que consigo te dizer melhor como fazer esta consulta.

Classe Imoveis

namespace Repositorio.Classes
{
    public class Imoveis
    {
        public virtual int cod_imovel { get; set; }
        public virtual IList<Cidadaos> Cidadao { get; set; } //Relacionamento N:N com a tabela Cidadaos
        public virtual Queixas Queixa { get; set; } //Chave estrangeira da tabela Queixas
        public virtual IList<Rotas> Rota { get; set; } //Relacionamento N:N com a tabela Rotas
        public virtual Ruas Rua { get; set; } //Chave estrangeira da tabela Ruas
        public virtual string Numero { get; set; }
        public virtual Bairros Bairro { get; set; } //Chave estrangeira da tabela Bairros
        public virtual string Quadra { get; set; }
        public virtual string Lote { get; set; }

    }
}

Mapeamento de Imoveis

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly ="Repositorio"
                   namespace="Repositorio.Classes">
  <class name ="Imoveis">
    <id name="cod_imovel">
      <generator class="identity"/>
    </id>
    <many-to-one name="Rua" column="cod_rua"/> <!-- Relacionamento N:1 com Ruas-->
    <many-to-one name="Bairro" column="cod_bairro"/> <!-- Relacionamento N:1 com Bairros-->
    <property name="Numero"/>
    <property name="Quadra"/>
    <property name="Lote"/>

    <!--Relacionamento N:N com a tabela de Cidadaos-->
    <bag name="Cidadao" table="Proprietarios">
      <key column="cod_imovel"/>
      <many-to-many class="Cidadaos" column="cod_cidadao"/>
    </bag>
    <!--*******************************************-->

    <!--Relacionamento N:N com a tabela de Rotas-->
    <bag name="Rota" table="Rota_Casa">
      <key column="cod_imovel"/>
      <many-to-many class="Rotas" column="cod_rota"/>
    </bag>
    <!--*******************************************-->

  </class>
</hibernate-mapping>

Classe Cidadaos

public class Cidadaos
    {
        public virtual int cod_cidadao {get; set;}
        public virtual IList<Imoveis> Imovel { get; set; } //Relacionamento N:N com 
        public virtual string Nome { get; set; }
        public virtual string Endereco { get; set; }
        public virtual Cidades Cidade { get; set; } //Chave Estrangeira de Cidades
        public virtual string Cep { get; set; }
        public virtual string CPF { get; set; }
        public virtual string RG { get; set; }
        public virtual string Telefone { get; set; }
        public virtual string Email { get; set; }

    }

Mapeamento de Cidadaos

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly ="Repositorio"
                   namespace="Repositorio.Classes">
  <class name ="Cidadaos">
    <id name="cod_cidadao">
      <generator class="identity"/>
    </id>
    <property name="Nome"/>
    <property name="Endereco"/>

    <many-to-one name="Cidade" column="cod_cidade"/> <!-- Relacionamento N:1 com Cidades-->

    <!--Relacionamento N:N com a tabela de Imóveis-->
    <bag name="Imovel" table="Proprietarios">
       <key column="cod_cidadao"/>
       <many-to-many class="Imoveis" column="cod_imovel"/>    
    </bag>
    <!--*******************************************-->

    <property name="Cep"/>
    <property name="CPF"/>
    <property name="RG"/>
    <property name="Telefone"/>
    <property name="Email"/>

  </class>
</hibernate-mapping>
solução!

Legal, dentro do create query do nhibernate você terá de escrever uma HQL ao invés de um sql. A diferença principal é que você escreverá a query em cima na verdade das suas classes, e não com relação as tabelas. Tanto que você não tem a classe Propriedade, mas possui a classe Cidadaos e Imovel .

Então se você está procurando a todos os Cidadãos que são proprietários de tal imóvel, sua query partirá da classe Cidadaos.

from Cidadaos cidadao

Só isso dentro do CreateQuery já trará todos os cidadãos cadastrados. Agora precisamos verificar o seu imóvel se é o que estamos pesquisando.

Dentro da classe Cidadaos existe uma lista de imovel:

public class Cidadaos
{
    public virtual int cod_cidadao {get; set;}
    public virtual IList<Imoveis> Imovel { get; set; } //Relacionamento N:N com 
    ...
}

Como a HQL é em relação as propriedades da classe, para fazer a junção ficará assim:

from Cicadaos cidadao join cidadao.Imovel imovel

Note que na HQL seria como se eu estivesse chamando a propriedade Imovel de Cidadaos. Na hora de executar esta HQL o próprio NHibernate fará a transformação da HQL para um SQL, traduzindo este join para o uso da tabela de Propriedade.

E note que eu já adicionei um alias para o imovel. Ai poderia fazer um where

from Cicadaos cidadao join cidadao.Imovel imovel where imovel.cod_imovel = :cod_imovel