Retornar uma list como parametro no hibernate SELECT NEW

3 respostas
gRoOve

Boa tarde, estou usando o SELECT NEW do hibernate para selecionar alguns campos que eu preciso e instanciar meu objeto, ocorre que um determinado atributo desse objeto é do tipo List, meu grande problema: como eu faço para o hibernate retornar essa List pro construtor?

Meu código é algo assim:

SELECT New MeuObjeto(obj.codObj, …, COMO MANDAR A LISTA PRO MEU CONSTRUTOR??)
FROM MeuObjeto obj
… left joins, etc.

3 Respostas

F

Amigo,
Você tem que fazer o relacionamento dentro da classe JPA.
Da uma olhada nesse tutorial do uaihebert (http://uaihebert.com/jpa-onetomany-e-manytoone-unidirecional-e-bidirecional/)

Quando você fizer o select, normalmente, o ORM já vai trazer a lista do objeto.
Lembrando que você tem determinar com Lazy ou Eager.

Se ficou com dúvida e só falar.

gRoOve

Olá felipe, não uso JPA, aqui é Hibernate puro.

Não fui claro na minha dúvida, as classes já estão devidamente mapeadas.

Meu problema ocorre usando o SELECT NEW trazendo somente algumas colunas necessárias para minha operação naquele cenário, as quais são setadas automaticamente pelo construtor do objeto em questão. Ocorre que não sei como gerar uma lista pelo hibernate, para então passar esta lista para meu construtor.

J

Olá @gRoOve tudo bem?

Faça o seguinte:
Crie uma classe auxiliar que tenha em seu construtor os campos do seu select (respeitando a ordem e o tipo do campos retornados)

E no seu select basta dar new nesta classe auxiliar criada.

public List<ClienteCidade> getClientesCidades() {
        try {
            StringBuilder QL = new StringBuilder();
            QL.append("SELECT new br.com.teste.ClienteCidade(");
            QL.append("c.id, c.nome, cid.id, cid.nome)");
            QL.append("\n FROM Cliente c");
            QL.append("\n JOIN c.cidade AS cid");
            return getEntityManager().createQuery(QL.toString()).getResultList();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
}

Um exemplo de teste para melhor entendimento, claro que pode ser melhorado :slight_smile:

Criado 5 de abril de 2016
Ultima resposta 7 de abr. de 2016
Respostas 3
Participantes 3