Query com hibernate!

Pessoal. Sou iniciante em hibernate e tenho uma dúvida.

Preciso desenvolver um webservice que faça o acesso ao banco e devolva uma lista de elementos.

O que acontece é o seguinte.

Este método tem que executar uma query SQL (select * from…).
Este select faz vários joins entre várias tabelas e retorna 3 campos.
Estes três campos de retorno eu vou jogar em uma lista de objetos.
Os objetos desta lista são de uma classe que tem os 3 ítens que serão retornados. Por exemplo, a query retorna “cpf, nome, endereco”… eu tenho uma classe Pessoa com estes campos.

No que eu vi até agora de hibernate, para vc mapear uma classe você deve fazer algo do tipo:

@Entity
@Table(name=“pessoas”)
public class Pessoa…

Mais isto funciona para quando você tem uma tabela com as colunas correspondentes aos atributos da classe que você vai mapear, certo?

Coomo eu mapeio uma classe que tem 3 campos que virão de uma consulta SQL contendo joins entre várias tabelas?
Como eu crio um método para executar esta querye e retornar os resultados em um List de objetos?

Valeu pessoal, agradeço muito se poderem me ajudar!!!

Bem isso, até onde eu sei, não da pra fazer. É preciso mapear cada uma das Tabelas em uma Classe.

Você pode fazer o seguinte, pra cada tabela no JOIN cria uma entidade com os atributos ‘correspondendo’ aos campos da tabela.
Feito isso, quando você for fazer o select você conseguiria usar uma query como

SELECT NEW SeuObjetoCom3Campos(p.campaA,b.campoB,d.campoC)FROM Pessoa p...

Mas no seu caso, se o WebService é simples assim você pode retornar os campos de uma query normal e montar o seu objeto manualmente, dentro de um laço.

Se você faz questão de usar o Hibernate ele faz querys nativas também, da mesma forma, mas não faz sentido usar uma biblioteca assim para algo simples, a menos que vc queira só estudar.

Um abraço, não sei se consegui te ajudar, se não for isso explica melhor ae :smiley:

Então na verdade eu não faço questão de usar.
Mais o pessoal aqui da empresa exige que seja feito assim.

No caso eu tenho que criar uma classe mapeada para cada tabela, e depois como eu executo esse select que você falou??

Valeu a força… um abraço!

Isso mesmo, acho que te atende.

Achei uns exemplos completos: [http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/queryhql.html]

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr
select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

Abraço.

Caio esses 3 campos fazem parte da mesma classe? Se fizer parte da mesma classe como você exemplificou, vira uma HQL normal.

select p from Pessoa p

E depois poderia utilizar o endereço caso for uma FK normalmente, só chamando apartir de Pessoa.

caio_sope,

creio que não entendi bem seu problema. Se vc tem uma classe Pessoa anotada como
entidade,seus atributos devem estar sendo carregados a partir da tabela na qual ela
é persistida.Atributos que pertencem a outras entidades devem estar devidamente mapeados,
de acordo com a cardinalidade.Assim a função de seus joins fica “encapsulada”.
O exemplo do daveiga usando HQL pode te servir. Talvez te ajudasse também dar uma olhada
nos relacionamentos para mapear melhor as classes.