[RESOLVIDO] setResultTransformer em EJB com JPA

7 respostas
D

Bom Dia Pessoal.

Tenho uma classe no meu sistema que é a classe que monta o menu para o usuário.
Essa classe NÃOé uma entidade e seus dados são retornado atraves de um consulta entre tres tabelas (area - usuário e usuarioArea), logo a composição destes dados formam uma lista de Menus.

Tenho um sistema que trabalha com Hibernate e Spring e nele tenho o recurso do setResultTransformer do Hibernate, que faz o cast da minha query nativa pra a classe em questão.
Minha dúvida é, existe alguma forma de fazer o mesmo em EJB,

Eu Consegui fazendo com o “iterator”, mas ficou feio pra caralho o código, abaixo segue o um exemplo do que fiz.

while( iterator.hasNext() ) {
     Object[] columns = iterator.next();
     ObjectEntity objectEntity = new ObjectEntity();
     Long idValue = (Long) columns[0];
     objectEntity.setId(idValue);
     ...
     listOfObjects.add(objectEntity);
}

Tentei colocar a classe Menu somente com a annotation @Entity, mas o servidor nem subiu dai, porque estava faltando o @Table.

Existe uma outra forma de “transformar”, de fazer esse cast com EJB ?

Att

7 Respostas

H

É possível criar uma query onde você pode fazer um new em uma classe não entity.

Aqui mostra como fazer: JPA Consultas e Dicas.

D

Olá Hebert, muito obrigado por me ajudar novamente.

Mas já tentei fazer o exemplo da página 13, porem, no seu exemplo voce retorna os dados assim

Query query = em.createQuery("select new com.model.PersonDogAmountReport(p, size(p.dogs)) from Person p group by p.id");

Não está utilizando a queryNative, no meu caso o retorno está vindo de uma view no banco de dados, imagina que tenho algo assim…

Query query = em.createNativeQuery("select * from vwListaMenuUsuario where login = "hebert" ");

Existe a possibilidade de fazer a consulta abaixo com o seu “createQuery” ?

H

Deverling:
Olá Hebert, muito obrigado por me ajudar novamente.

Mas já tentei fazer o exemplo da página 13, porem, no seu exemplo voce retorna os dados assim

Query query = em.createQuery("select new com.model.PersonDogAmountReport(p, size(p.dogs)) from Person p group by p.id");

Não está utilizando a queryNative, no meu caso o retorno está vindo de uma view no banco de dados, imagina que tenho algo assim…

Query query = em.createNativeQuery("select * from vwListaMenuUsuario where login = "hebert" ");

Existe a possibilidade de fazer a consulta abaixo com o seu “createQuery” ?

Se vwListaMenuUsuario retorna todos os dados prontos, por que você naõ aponta uma entity para ela? [=

D

Sim eu tentei fazer isso.
Porem ao mapear a classe Menu somente com o @Entity, sem o @Table , por exemplo.

@Entity
public class Menu{

}

o Jboss nem sobe, pois, “acho” que tem colocar o @Table (mas não tenho certeza disso)…

E se apenas declarar a classe Menu sem o @Entity, por exemplo

public class Menu{

}

o erro retornado é o “unknown entity”…

É obrigatorio efetuar o vinculo de uma @Entity, como uma tabela ?

H

Deverling:
Sim eu tentei fazer isso.
Porem ao mapear a classe Menu somente com o @Entity, sem o @Table , por exemplo.

@Entity
public class Menu{

}

o Jboss nem sobe, pois, “acho” que tem colocar o @Table (mas não tenho certeza disso)…

E se apenas declarar a classe Menu sem o @Entity, por exemplo

public class Menu{

}

o erro retornado é o “unknown entity”…

É obrigatorio efetuar o vinculo de uma @Entity, como uma tabela ?

Se vc não apontar uma table ele vai procurar uma tabela com o mesmo nome da classe.

Esse post explica o básico do JPA: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

D

Legal, mas então, existe uma outra forma de trazer os dados, sem o Iterator ?

Att

D

Hebert, não sei se havia passado esse solução pela sua cabeça.

Mas pensei se resolvi um conceito básico de banco de dados que diz…

[b]
Uma view é uma maneira alternativa de observação de dados de uma ou mais entidades (tabelas), que compõem uma base de dados. Pode ser considerada como uma tabela virtual ou uma consulta armazenada.

Definição vinda do DevMedia


[/b]

Logo, se eu mapear uma entidade, apontando apenas para uma view irei conseguir o que precisava, pois o menu é a lista do resultado dos joins das minhas três tabelas
como mencionei anteriormente.

Logo, o mapeamento ficará assim

@Entity
@Table(name="vwlistamenuusuario")
public class Menu {
           ...atributos
           ...get and set
}

Não sei a tua opnião, mas as vezes programamos em um nível tao alto, com framework e tantas ferramentas que nos auxiliam
que tenho a impressão que esquecemos de conceitos básicos como este… Hehehehe

Abs e muito obrigado pela ajuda.

Criado 14 de fevereiro de 2013
Ultima resposta 14 de fev. de 2013
Respostas 7
Participantes 2