Como devolver uma lista em um subselect (hibernate)

4 respostas
thiagocg

Bom dia pessoal, imaginem o seguinte cenário:

Uma pessoa tem muitos apelidos e muitos telefones, criei uma classe (vo) que me retorna os dados que preciso da classe pessoa mais uma lista de String de apelidos e outra lista de String de telefones.

Ex da classe PessoaVO:

PessoaVO vo = new PessoaVO(Long id, String nome, String sobreNome, List<String> apelidos, List<String> telefones){
...
}

Na consulta faço um select new PessoaVO(p.id, p.nome, p.sobreNome, (subselect de apelidos), (subselect de telefones)).
Até onde eu sei não é permitidido devolver mais de um registro em um subselect na clausula select, então não estou conseguindo devolver as listas para o construtor do meu ‘VO’, como vcs resolveriam esta questão?

O meu cenario é bem mais complexo e o exemplo apresentado é apenas para ilustrar a situação, mas o relevante para este problema é a questão do subselect que devolve a lista para meu construtor.

Grato a todos.

[]'s

4 Respostas

A

cara,

vc tentou fazer assim,

select p
from Pessoa p
  join FETCH p.telefones t
  join FETCH p.apelidos a

t+

CharlesAlves

Bom como você está utilizando hibernate para fazer a pesquisa ele já faz a associação direta e te retorna os telefones e apelidos do usuário, a não ser que você queira fazer um filtro e pegar somente algum deles, tenta fazer por criteria.

Criteria c = session.createCriteria(class);

c.add(Restrictions.eq("id", p.getId());
c.add(Restrictions.eq("nome", p.getNome());
c.add(Restrictions.eq("sobrenome", p.getSobrenome());

c.uniqueResult();

Só é manter a sessão aberta ou marcar os campos como eager que ele retorna tudo que você precisa.

thiagocg

Obrigado pelas respostas, mas meu cenário como eu disse é bem mais complexo e eu não posso colocar o relacionamento como eager e nem mesmo navegar pelo grafo de objetos para pegar as coleções associadas, por este motivo utilizei a estrategia do ‘VO’ com subconsultas.

Vou continuar pesquisando, obrigado pessoal.

Toda ajuda é bem vinda :smiley:

[]'s

A

entao cara,

acho que vc vai ter que fazer uma query native para resolver seu problema.

t+

Criado 24 de outubro de 2011
Ultima resposta 24 de out. de 2011
Respostas 4
Participantes 3