Ajuda com Sql nativo no Hibernate [Resolvido............]

8 respostas
supertchuco

Boa tarde a todos estou com um problema que me está fazendo arrancar os cabelos…

É o seguinte , tenho uma tela , que um usuário digita qualquer slq, tanto insert, update , select …etc…, abaixo o código no java onde está o problema :

@SuppressWarnings("unchecked")
    public List<List> listaComSql(final String sql) throws UnisException {
    	
   	return (List<List>)genericEntityDao.getHibernateTemplate().execute(
   	        new HibernateCallback() {
   	          public Object doInHibernate(final Session session) {
   	           
   	        	  SQLQuery q = session.createSQLQuery(sql);	

   	        		        	
   	         q.setResultTransformer(Transformers.TO_LIST   );
   	        	  
   	        	
   	           		  
   	           	     return q.list();  
   	           		  
      	          }
   	        });

O problema é que se o comando é um select , então o q.list() retorna algo , nem que seja uma lista vazia , se é outra coisa (insert, update)ele não cria essa list() , e o programa acaba gerando esse erro ao tentar retornar o q.list() “ERROR [JDBC EXCEPTION] NO RESULT FOR SQL”.

Eu preciso diferenciar se o retorno vai ter uma lista ou não , ou poder diferenciar se o resultado da operação tem um retorno ou não , tá brabo, não consigo testar isso, :x

8 Respostas

malucocelo

Verifica se a String recebida começa com select, update ou delete.

supertchuco

Pensei nisso, mas o usuário pode digitar qualquer bloco de sql, misturando , então pensei se teria como testar se no “q” existe o objeto list() criado , mas não encontrei algo do tipo…

Poneis123

Cara, não entendo muito de hibernate, se eu falar bosta desculpa ae.
mas assim, quando vc chama o q.list() é uma chamada de um método certo? não tem como o método hora retornar uma lista, hora não retornar.

supertchuco

A questão seria, antes de dar o retorno dessa função , eu verificaria se o q.list() existe, caso não gerava outro retorno.

Poneis123

num da pra colocar ele num try catch?

try{ List lst = q.list(); return lst; }catch(Exception e){ return &lt;seu outro retorno&gt; }

novamente se eu falei alguma coisa grotesca, foi mal… só tentando ajudar de alguma forma =)

supertchuco

Capaz , kra …

Tipo o que tu me disse agora até serve, mas tem como diferenciar duas excessões , tipo uma é essa : error[jdbc exception] no result for sql , essa excessão teria um bloco catch e depois teria que ter outro para as outras excessões…
Teria como ? Não entendo muito desta parte…

Poneis123

tem sim…

na verdade vc não precisa criar um bloco catch para todas as exceções possiveis… vc cria somente para as que vc quer tratar q no caso é a (error[jdbc exception] no result for sql) as demais serão jogadas para o chamador do seu método listaComSql() como uma exceção UnisException q ta na assinatura do método.

Mas pra vc tratar apenas essa exceção vc precisa saber qual é exatamente a exceção q ta retornando, provavelmente o seu está retornando a seguinte exceção:
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/JDBCException.html

ai vc precisa fazer o bloco da seguinte forma:

try{ List lst = q.list(); return lst; }catch(JDBCException e){ return &lt;seu outro retorno&gt; }

Testa ae =)

supertchuco

Bah velho valeu mesmo , eheheh agora aprendi a parte das excessões…

segue a solução

@SuppressWarnings("unchecked")
    public List<List> listaComSql(final String sql)  {

    	
   	    return (List<List>)genericEntityDao.getHibernateTemplate().execute(
   	        new HibernateCallback() {
   	          public Object doInHibernate(final Session session) {
   	           
   	        	  List<List> lista = new ArrayList<List>();
   	        	  SQLQuery q = session.createSQLQuery(sql);	
   	        	  q.setResultTransformer(Transformers.TO_LIST   );
   	        	
   	        	 try { 
   	        	  
   	        	  lista = q.list();
   	        	  return lista ;
   	        	  
   	        	 } catch (JDBCException e) {
   	      		    
   	        		 
   	        		List<DtoNulo> listaDtoNulo = new ArrayList<DtoNulo>(); 
   	        		DtoNulo erro = new DtoNulo();
   	        		listaDtoNulo.add(erro);
   	        		lista.add(listaDtoNulo);
   	        		 
   	        		 return lista ;
   	      		
   	        	 	} 
   	          }
   	        });
    }

Só tive que fazer uma gambiarra ali no retorno , mas funfou bem…

Criado 12 de março de 2010
Ultima resposta 12 de mar. de 2010
Respostas 8
Participantes 3