Valor retornado por SQL nativo

10 respostas
R

Pessoal, tenho o método abaixo com sql nativo conforme podem ver. Quando executo essa sql no meu SGBD retorna os valores corretos (sem duplicar), só que quando executo via aplicação java, as colunas t.descricao, v.descricao as ve, g.descricao as g é retornada com valores iguais, até dei nome para as colunas, mas não resolveu. Alguém sabe o que pode estar ocorrendo?

public List<SolicitacaoDeterminacaoVO> buscarAmostraPorSolicitacao2(
			Integer solicitacao) {

		StringBuilder sql = new StringBuilder();

		sql.append("select distinct a.codigo, a.cultura, a.profundidade, t.descricao, v.descricao as ve, g.descricao as g, p.nome from amostra a inner join solicitacaodeterminacao sol on sol.id_amostra = a.codigo inner join determinacao d on d.codigo = sol.id_determinacao inner join vegetacao v on v.codigo = a.vegetacao_codigo inner join topografia t on t.codigo = a.topografia_codigo inner join gleba g on g.codigo = a.gleba_codigo inner join solicitacaodeanalise s on s.codigo = sol.solicitacao_codigo inner join propriedade p on p.codigo = a.propriedade_codigo where s.codigo =" + solicitacao);

		List<SolicitacaoDeterminacaoVO> listaRetorno = new ArrayList<SolicitacaoDeterminacaoVO>();

		try {

			Session session = HibernateUtil.getSessionFactory().openSession();
			SQLQuery query = session.createSQLQuery(sql.toString());

			List lista = query.list();

			for (Object obj : lista) {
				Object[] valores = (Object[]) obj;

				SolicitacaoDeterminacaoVO linha = new SolicitacaoDeterminacaoVO();

				linha.setAmostra(valores[0]);
				linha.setCultura(valores[1]);
				linha.setProfundidade(valores[2]);
				linha.setTopografia(valores[3]);
				linha.setVegetacao(valores[4]);
				linha.setGleba(valores[5]);
				linha.setPropriedade(valores[6]);
				
				System.out.println(linha.getAmostra());
				System.out.println(linha.getCultura());
				System.out.println(linha.getProfundidade());
				System.out.println(linha.getTopografia());
				System.out.println(linha.getVegetacao());
				System.out.println(linha.getGleba());
				
				
				listaRetorno.add(linha);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

10 Respostas

Hebert_Coelho

Faça com que sua classe implemente o hashCode/equals e utilize set ao invés list.

Hebert_Coelho

Você pode também utilizar distinct em sua consulta.

E com native query você pode retornar objetos prontos já.

Depois você olha isso: JPA Consultas e Dicas.

R

Olá Hebert.

Primeiramente obrigado pelo contato. Poderia me dar um exemplo de como ficaria usando HashCode/equals e Set ao invés de List?

Desde já agradeço.

Abraço.

Renan.

pmlm

A solução do Hebert não é para o teu problema, é para quando aparecem linhas repetidas.
Tu já evitas as linhas repetidas usando o DISTINCT.

O problema que tu reportas é solucionado pela forma que tu já fizeste, dar alias diferentes às colunas. De certeza que é código que estás a executar é o código com os alias?

Hebert_Coelho

pmlm:
A solução do Hebert não é para o teu problema, é para quando aparecem linhas repetidas.
Tu já evitas as linhas repetidas usando o DISTINCT.

O problema que tu reportas é solucionado pela forma que tu já fizeste, dar alias diferentes às colunas. De certeza que é código que estás a executar é o código com os alias?

Eu falei do discintct também. =P

Eu não mostrei como utilizar set hashCode/equals pois é o básico de programação Java e consegue ser facilmente encontrado. ^ ^

R

Olá pmlm.

Agradeço o contato. Sim o código que esta sendo executado é o que dei alias as diferentes colunas. No SGBD esta funcionando normalmente, mas via aplicação esta trazendo valores repetidos para as colunas. Tem alguma solução para o caso?

Desde já agradeço.

Renan.

R

Olá Hebert, você falou do distinct só que já tinha aplicado o mesmo quando postei o código. Em relação ao hashCode/equals, sei que é básico da programação java, agora não entendi a aplicabilidade para o meu caso. Se puder postar uma solução utilizando isso eu agradeço.

Abraços.

Renan.

Hebert_Coelho

renanlalier:
Olá Hebert, você falou do distinct só que já tinha aplicado o mesmo quando postei o código. Em relação ao hashCode/equals, sei que é básico da programação java, agora não entendi a aplicabilidade para o meu caso. Se puder postar uma solução utilizando isso eu agradeço.

Abraços.

Renan.

Eu falei não foi pq você já tinha aplicado. Era pq ajuda a eliminar repetição.

o hashCode/equals é aplicável quando se vai utilizar o Set.

Implemente esse métodos em sua classe e utilize Set ao invés de List.

pmlm

Com alias não deveria ocorrer esse problema. Faz assim, para garantir que esse sql está mesmo sendo executado, muda SELECT para SLEECT ou algo assim e executa. Se der erro é porque é mesmo esse que está sendo executado e não faço a mínima ideia de porque está a acontecer. Se não der erro é porque não estás a executar esse sql. Provavelmente tens de fazer um clean do projecto.

R

Pessoal, funcionou com JDBC. Surreal, mas foi a unica forma de resolver o problema, nenhuma outra tentativa funcionou.

List<SolicitacaoDeterminacaoVO> listaRetorno = new ArrayList<SolicitacaoDeterminacaoVO>();

		try {
			
			Connection conexao = HibernateUtil.getSessionFactory().openSession().connection();
			PreparedStatement comando = conexao.prepareStatement(sql.toString());
			ResultSet resultado = comando.executeQuery();
			
			while(resultado.next()){
				SolicitacaoDeterminacaoVO linha = new SolicitacaoDeterminacaoVO();

				linha.setAmostra(resultado.getObject("a.codigo"));
				linha.setCultura(resultado.getObject("a.cultura"));
				linha.setProfundidade(resultado.getObject("a.profundidade"));
				linha.setTopografia(resultado.getObject("t.descricao"));
				linha.setVegetacao(resultado.getObject("v.descricao"));
				linha.setGleba(resultado.getObject("g.descricao"));
				linha.setPropriedade(resultado.getObject("p.nome"));

				System.out.println(linha.getAmostra());
				System.out.println(linha.getCultura());
				System.out.println(linha.getProfundidade());
				System.out.println(linha.getTopografia());
				System.out.println(linha.getVegetacao());
				System.out.println(linha.getGleba());

				listaRetorno.add(linha);
			}
			
			conexao.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

Abraços.

Renan.

Criado 29 de setembro de 2012
Ultima resposta 2 de out. de 2012
Respostas 10
Participantes 3