Como receber as entidades de um select separadas?

8 respostas
EuclidesFilizola

Boa tarde pessoal,

eu gostaria de tirar uma dúvida com vocês.

quando eu tiver um select que envolva mais de uma entidade.

exemplo:

select * from Pessoa p, Funcionario f;

como faço para o resultado vir como entidades? Porque normalmente eu faço uma List<Object[]>.

e depois faço alguns cast, e pego cada atributo separadamente. Porém isso da muito trabalho, e quando são selects muito grandes, o codigo fica enorme.

Gostaria de saber qual solução tem para isso? Eu vi um pouco do @SqlResultQuery e o JPA NativeQuery, porém não sei se funciona para o meu caso e se funciona, gostaria que alguém me desse algum exemplo.

8 Respostas

fabiofalci

A solução é Hibernate! Pq não está usando?

EuclidesFilizola

Já estou usando. Só não sei se vc me entendeu.

Seguinte.

eu tenho entidade Funcionario. Se eu fosse fazer um select só para funcionario, era só fazer uma namedQuery e tudo funciona beleza.

conforme esse exemplo:

@NamedQueries({
	@NamedQuery(name="listarTdsNFs",query="select notaf from NotaFiscal notaf"),

e aqui está o DAO.

try{
		
			manager.getTransaction().begin();
		
		final Query query = manager
		.createNamedQuery("listarTdsNFs");
		
		listaNF = query.getResultList();
		
		manager.getTransaction().commit();
		
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			
			if (manager != null) {
				manager.close();
			}

O problema é quando eu tenho mais de uma entidade em um select, como eu faço para traze-las ? já que no resultado do select, vem tudo misturado.

exemplo:

try{
		manager.getTransaction().begin();
		
		final Query query = manager
		.createNativeQuery("SELECT * FROM financeiro.TBSIFN_NOTAFISCAL N," +
		"financeiro.TBSIFN_FONTE_RECURSOS F WHERE N.cd_NotaFiscal = "+codNotaFiscal+" AND N.cd_FonteRecursos = F.cd_FonteRecursos ");
		
		
lista = query.getResultList();

Entendeu ?


Alexandre_Saudate

Do jeito que você está fazendo, o resultado da Query é uma lista de array de objects (List<Object[]>). Aí, é só checar quais são os objetos em cada índice do array. Não sei se me fiz entender, se tiver dúvidas, avise.

[]´s

EuclidesFilizola

Pois é, isso é oq eu faço.

......................


public void procurarBensNaoTombados(){
		
		ArrayList&lt;Object[]&gt; listaBens = new ArrayList&lt;Object[]&gt;();
	
		
		for (Object lista : this.listarBensNaoTombados()) {
			
			listaBens.add((Object[]) lista);
			
		}
		
		
		
		for (Object[] list : listaBens) {
			
			String numNF = ""+(Integer)list[0];
			
			notaFiscal.setNumNotaFiscal(numNF);
			
			//list[0] = notaFiscal.getNumNotaFiscal();
			

................................

O problema disso é que eu tenho que fazer um monte de cast, tenho que fazer vários arrays… e fica um código muito grande. !

Alguem tem outro tipo de solução ? @sqlResultList ? JPA NativeQuery ? … .coisa parecida ?

P

A vantagem de se usar o hibernate é poder trabalhar com objetos e não com resultados de SQLs, use o mapeamento ja criado entre as classes pra recuperar o que vc precisa.

EuclidesFilizola

eu já faço isso ! Mas o problema é que quando o select possui mais de uma entidade, não é simples assim para mapear o resultado do select.

Entendeu. ?

danieldomingues86

Olá,

Cara… voce diz que está usando, mas só se for query nativa, pois o que o hibernate fornece voce não está.

Dê uma olhada na documentação para voce entender a diferença de fazer um createNativeQuery() e fazer um createQuery()

Esse link vai te ajudar a entender melhor :

Abraços.

EuclidesFilizola

Em outros métodos eu estou utilizado namedQuery ! entendeu ? Que eu só chamo o nome da NamedQuery e pronto. E me desculpem se eu me expressei mal, eu estou utilizando JPA. Nesse meu especifico é que eu estou usando NativeQuery, que é escrever o sql puro como se escreve no banco.

Só que como são várias entidades ao mesmo tempo, eu preciso de algo a mais ! Estou tentando utilizar o @SQLResultSetMapping. que é exatamente oq eu preciso. !

entende. ?

Criado 11 de junho de 2010
Ultima resposta 11 de jun. de 2010
Respostas 8
Participantes 5