Buscar entidade que tenha 1 ou mais item na coleção

4 respostas
juloliveira

Imaginem a seguinte situação:

Eu tenho uma entidade PESSOA com uma coleção de FILHO. Mais ou menos
assim:

class Pessoa
{
Collection Filhos //get //set

}

Dessa maneira uma “Pessoa” pode conter 0, 1 ou mais entidades “Filho”

Ok, como eu faço uma query que peguem só as “PESSOA” com 1 ou mais
filhos?

Valeu

[]´s

4 Respostas

juloliveira

Desculpem fazer um up do post!
É que estou com esse problema e não consigo achar a solução no google justamente por não saber “como procurar” essa informação.

[]´s

W

Cara vc pode fazer assim

select p,count(f) from Pessoa p join p.filhos f
group by p //vc vai ter q agrupartodos os atributos da pessoa
having count(f) > 0

assim vc vai ter como resultado uma lista, onde cada linha vai ter dois objetos a pessoa e um integer da quantidade de filhos

mas cara isso que vc quer não morre com o join, pois ele vai trazer apenas pessoas que tenham filhos!!
não é isso que vc quer??

select p from Pessoa p join p.filhos f

aí ficaria assim

juloliveira

Wallace,

Valeu a ajuda. Funcionou certinho.

Para ajudar outros usuários vou postar como ficou minha HQL.
Na minha questão usei entidades Pessoa e Filho como exemplo apenas, no meu caso real são Sessao e Simulacao as entidades análogas ao meu exemplo.

Lembrando também que a minha plataforma de desenvolvimento é .NET e o NHibernate tem quase todas as mesmas funcionalidades do Hibernate do Java.

Pois bem, seguindo o exemplo do Wallace minha queri HQL ficou da seguinte forma:

IQuery query = _session.CreateQuery("select se, count(si) from Sessao se " + "join se.Simulacoes si " + "group by se.Id, " + "se.IP, " + "se.EfetivouPagamento, " + "se.CartaoDeCredito, " + "se.ValorPago, " + "se.CriadoEm, " + "se.UltimaAtualizacaoEm " + "having count(si) > 0");

O NHibernate gerou a seguinte query SQL:

select sessao0_.idSession as idSession0_, sessao0_.Ip as Ip0_, sessao0_.Paid as Paid0_, sessao0_.CreditCard as CreditCard0_, sessao0_.Value as Value0_, sessao0_.CreatedAt as CreatedAt0_, sessao0_.LastUpdatedAt as LastUpda7_0_, sessao0_.idSession as x0_0_, count_big(simulacoes1_.idSimulation) as x1_0_ from Sessions sessao0_ inner join Simulations simulacoes1_ on sessao0_.idSession=simulacoes1_.idSession group by sessao0_.idSession , sessao0_.Ip , sessao0_.Paid , sessao0_.CreditCard , sessao0_.Value , sessao0_.CreatedAt , sessao0_.LastUpdatedAt having (count_big(simulacoes1_.idSimulation)>0 )

Isso me retorna todas as minhas entidades Sessao que tem pelo menos UMA OU MAIS entidades Simulações

Wallace, valeu!!!

[]´s

W

fico feliz em poder ajudar.

obrigada.

Criado 18 de fevereiro de 2009
Ultima resposta 20 de fev. de 2009
Respostas 4
Participantes 2