[Nhibernate] DetachedCriteria com tabelas não mapeadas

15 views
Skip to first unread message

Husseyn Hussa

unread,
May 20, 2015, 6:24:36 PM5/20/15
to Nhibernate Br, dotn...@googlegroups.com
Galera, tudo bom?

preciso fazer a seguinte DC

select distinct *
from CA_Area a 
inner join
CA_AreaPorPerfil app
on app.areaId = a.areaId
where a.areaPaiId = 11
and app.perfilId in
(select perfilId from CA_perfilPorUsuario where adminUsuarioId = 1)
order by a.ordem asc

Porém as tabelas CA_AreaPorPerfil e CA_PerfilPorUsuario não são mapeadas, apesar de constarem nos mapeamentos para fins de relacionamento.

É possível ou preciso mapear essas duas tabelas?

Abs e obrigado!

Bruno D'Alessio

unread,
May 27, 2015, 3:07:56 PM5/27/15
to nhiber...@googlegroups.com, dotn...@googlegroups.com

Creio que seria  possível através de linq ou lambda.

Com DC o nh vai  precisar dos  artefatos mapeados para que ele possam realizar a query.

Posso estar errado, se não tivesse na rua, daria uma  pesquisada para ter certeza!

Abs,

--
Você recebeu essa mensagem porque está inscrito no grupo "NHibernate-Br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-b...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para nhiber...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/nhibernate-br.
Para mais opções, acesse https://groups.google.com/d/optout.

Husseyn Hussa

unread,
May 28, 2015, 10:03:38 AM5/28/15
to Nhibernate Br, dotn...@googlegroups.com
Rolou, repost da solução:

Consegui, era bobeira.

Era só criar um alias pra propriedade, mesmo sendo uma lista.

segue:

ISession session = NHibernateHelper.OpenSession();
                ICriteria query;

                DetachedCriteria dcUsuario = DetachedCriteria.For<Modelo.ControleAcesso.CaAdminUsuario>("usuario")
                    .Add(Restrictions.Eq("Id", usuarioId))
                    .CreateAlias("usuario.Perfis", "perfis")
                    .SetProjection(Projections.Distinct(Projections.Property("perfis.Id")));

                DetachedCriteria dcPerfis = DetachedCriteria.For<Modelo.ControleAcesso.CaPerfil>("perfil")
                    .Add(Subqueries.PropertyIn("perfil.Id", dcUsuario))
                    .CreateAlias("perfil.Areas", "areas")
                    .SetProjection(Projections.Distinct(Projections.Property("areas.Id")));

                query = session.CreateCriteria<Modelo.ControleAcesso.CaArea>("area")
                    .Add(Subqueries.PropertyIn("area.Id", dcPerfis));

                if (areaId != 0)
                {
                    query.Add(Restrictions.Eq("AreaPaiId.Id", areaId));
                }
                else
                {
                    query.Add(Restrictions.IsNull("AreaPaiId.Id"));
                }
                query.AddOrder(new Order("Ordem", true));

                return query.List<Modelo.ControleAcesso.CaArea>();


e a sql gerada

SELECT 
this_.areaId as areaId6_0_, 
this_.Titulo as Titulo6_0_, 
this_.TituloCurto as TituloCu3_6_0_, 
this_.Codigo as Codigo6_0_, 
this_.VisivelNoMenu as VisivelN5_6_0_, 
this_.Ordem as Ordem6_0_, 
this_.areaPaiId as areaPaiId6_0_, 
this_.paginaPadraoEntradaId as paginaPa8_6_0_ 
FROM CA_Area this_ 

WHERE 
this_.areaPaiId = 11 and
this_.areaId in (
SELECT distinct areas1_.areaId as y0_ 
FROM CA_Perfil this_0_ 
inner join 
CA_AreaPorPerfil areas3_ 
on this_0_.perfilId=areas3_.perfilId 
inner join CA_Area areas1_ 
on areas3_.areaId=areas1_.areaId 
WHERE this_0_.perfilId in (
SELECT distinct perfis1_.perfilId as y0_ 
FROM CA_AdminUsuario this_0_0_ 
inner join CA_PerfilPorUsuario perfis3_ 
on this_0_0_.adminUsuarioId=perfis3_.adminUsuarioId 
inner join CA_Perfil perfis1_ 
on perfis3_.perfilId=perfis1_.perfilId 
WHERE this_0_0_.adminUsuarioId = 1))

Bruno D'Alessio

unread,
May 28, 2015, 11:08:14 AM5/28/15
to nhiber...@googlegroups.com

Show!

Reply all
Reply to author
Forward
0 new messages