Boa terde galera, estou com um probleminha que ta me deixando louco, eu montei uma logica para fazer um load em qualquer tabela que for passado para o método, pois bem, no final d metodo eu executo o select que me retorna uma lista de object e eu pego a primeira posição e tento transformar para o tipo que é o retorno do meu metodo
public<TextendsDAO>Tget(Tobject)throwsException{....Queryquery=em.createNativeQuery("select * from "+nomeTabela+" where 1=1 "+criterios);List<Object>lista=query.getResultList();if(!lista.isEmpty()){Objectresult=lista.get(0);object=(T)result;returnobject;}
mas no hora que faz o objec = (T) result, da o erro cannot be cast to DAO, no caso “DAO” é uma classe que todas as tabelas do banco estendem dela
Desculpe, mas seu metodo contem algo chamado “Parameter Assignment”, ou seja, esta fora dos bons padroes de programacao. O que isso quer dizer ? Simples, voce passa um parametro no metodo, chamado T object, e dentro do metodo voce atribui valores a este object e ainda o retorna, o que não é recomendado, pois pra esse caso, bastava voce criar um metodo sem parametros que retornasse um objeto, dai voce atribuiria o resultado ao T object.
R
rof20004
Outra coisa,
<TextendsDAO>
T extende DAO, logo, T = DAO, logo, cannot be cast to DAO.
RafaelCassau
Boa tarde matheus_paulo93, cara passei pelo mesmo problema varias vezes, não sei por qual motivo quando vc usa o createNativeQuery(); ele não faz o cast, usei uma solução meio improviso técnico, fazendo da seguinte forma, ao invés de retornar para uma lista vc cria um vetor de objetos e da um toArray(); na sua lista assim:
espero ter ajudado, caso ache uma solução mais elegante por favor posta ae para que eu possa adotar,
obs escrevi esse metodo aki mesmo no editor html caso tenha erros de sintaxe não leve em consideração é só um exemplo mesmo.
t+
matheus_paulo93
Bom dia RafaelCassau,
tentei fazer o seu jeito, maa na hora que vai dar o toarray, continua dando o erro do cannot be cast to DAO
obrigado, vou continuar tentando, se eu conseguir algo te falo
RafaelCassau
cara tem como vc postar o codigo inteiro pra mim dar uma olhada?
matheus_paulo93
Ta ai
public<TextendsDAO>Tget(Tobject)throwsException{if(emf!=null&&emf.isOpen()&&em!=null&&em.isOpen()){if(object.getDaoCriteria()==null){object.setDaoCriteria(newDAOCriteria(object.getClass()));}Field[]field=object.getClass().getDeclaredFields();for(inti=1;i<field.length;i++){Methodmethod=object.getClass().getDeclaredMethod("get"+field[i].getName().substring(0,1).toUpperCase()+field[i].getName().substring(1));if(method!=null&&method.invoke(object)!=null&&method.invoke(object)!=""&&!method.invoke(object).equals(0)){if(field[i].getType().getSuperclass()==DAO.class){}else{object.getDaoCriteria().addIgual(field[i].getName(),"'"+method.invoke(object)+"'");}}}Stringcriterios="";for(Criterionitem:object.getDaoCriteria().getCriterios()){criterios+="and "+item.toString()+" ";}StringnomeTabela=object.getClass().getSimpleName().substring(0,1).toLowerCase()+object.getClass().getSimpleName().substring(1);Queryquery=em.createNativeQuery("select * from "+nomeTabela+" where 1=1 "+criterios);T[]lista=(T[])query.getResultList().toArray();if(lista.length>0){Tresult=lista[0];returnresult;}}returnnull;}
matheus_paulo93
Fala Rafael, eu consegui!!!
o método createNativeQuery() te mais um parametro, que é a classe, ou seja o .class do seu objeto então ficou da seguinte forma
Query query = em.createNativeQuery("select * from "+nomeTabela+" where 1=1 "+criterios, object.getClass());
Funcionou perfeitamente!!!
muito obirgado pela sua contribuação
RafaelCassau
Que bom q deu certo cara, caso naum tenha mais duvidas por favor altere o titulo do topico para [RESOLVIDO]