Olá pessoal, boa tarde.
Descobri que o problema não é com a subquery, mas sim com o retorno da minha lista.
Ao efetuar um .list() com os campos que quero no select, existem alguns que estão nulos, neste
caso “historicoAcesso.usuario.perfil.idPerfil” e “historicoAcesso.usuario.perfil.imagemPerfil.foto”.
Esses dois relacionamentos são do tipo Lazy e pode ser esse o motivo que está me retornando nullPointer, durante os
get()’s.
Alguém sabe como contornar esse problema?
Abs,
Att,
Lessandro
De: Lessandro Notaroberto Pyrâmides [mailto:lessandron...@gmail.com]
Enviada em: sexta-feira, 13 de julho de 2012 21:00
Para: jav...@googlegroups.com; jav...@googlegroups.com; javano...@googlegroups.com
Assunto: Erro com Subselect utilizando QueryDSL
Olá pessoal, boa noite.
Comecei a utilizar QueryDSL nesse momento, porém estou tentando criar uma SubQuery para
capturar elementos existentes. Segue:
JPQLQuery query = new JPAQuery(entityManager);
QHistoricoAcesso historicoAcesso = QHistoricoAcesso.historicoAcesso;
List<Object[]> historicos = query.from(historicoAcesso)
.where(historicoAcesso.idHistoricoAcesso.in(new HibernateSubQuery().from(historicoAcesso).groupBy(historicoAcesso.usuario.idUsuario)
.list(historicoAcesso.idHistoricoAcesso.max()))).limit(8)
.list(historicoAcesso.dataLogin, historicoAcesso.dataLogout, historicoAcesso.usuario.idUsuario, historicoAcesso.usuario.nome,
historicoAcesso.usuario.perfil.idPerfil, historicoAcesso.usuario.perfil.imagemPerfil.foto);
Porém ao executar a query com a subquery recebendo o erro de NullPointer.
Alguém sabe como solucionar esse problema?
Obs: Quando removo a subquery, a query funciona normalmente.
Agradeço desde já,
Abs,
Att,
-----------------------------------------------------------------------------------------------------
Lessandro Notaroberto Pyrâmides
Analista de Sistemas Java Web, Desktop, Mobile e .NET
MBA em Gestão de Projetos em TI – Universidade Federal de Juiz de Fora
MSN: lessa...@hotmail.com
Emails: lessandron...@gmail.com / lessa...@hotmail.com
Tels: +55 (32) 9108-6144 / (32) 8871-3868
Juiz de Fora - MG
-----------------------------------------------------------------------------------------------------
Com a ajuda de um amigo, resolvi da seguinte forma:
public List<HistoricoAcesso> getUltimosAcessos() {
try {
QHistoricoAcesso ha = QHistoricoAcesso.historicoAcesso;
QUsuario usuario = QUsuario.usuario;
QPerfil perfil = QPerfil.perfil;
QImagemPerfil imagemPerfil = QImagemPerfil.imagemPerfil;
JPAQuery query = new JPAQuery(entityManager);
ListSubQuery<Long> subQuery = new SQLSubQuery().from(ha).where(ha.dataLogout.isNotNull()).groupBy(ha.usuario.idUsuario).list(ha.idHistoricoAcesso.max());
List<Object[]> result = query.from(ha)
.innerJoin(ha.usuario, usuario)
.innerJoin(usuario.perfil, perfil)
.leftJoin(perfil.imagemPerfil, imagemPerfil)
.where(ha.idHistoricoAcesso.in(subQuery)).limit(8)
.list(ha.idHistoricoAcesso, ha.dataLogin, ha.dataLogout, usuario.idUsuario, usuario.nome, perfil.idPerfil, imagemPerfil.idFoto, imagemPerfil.foto);
List<HistoricoAcesso> historicos = new HistoricoAcessoTransformer().transformTuple(result);
return historicos;
} catch (Exception ex) {
System.out.println(ex);
return null;
} finally {
}
O grande detalhe é agrupar os relacionamentos no innerJoin, com os objetos QueryDSL.