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 <T extends DAO> T get(T object) throws Exception {
.
.
.
.
Query query = em.createNativeQuery("select * from "+nomeTabela+" where 1=1 "+criterios);
List<Object> lista = query.getResultList();
if(!lista.isEmpty()){
Object result = lista.get(0);
object = (T) result;
return object;
}
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
me ajudem!!!
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.
Outra coisa,
<T extends DAO>
T extende DAO, logo, T = DAO, logo, cannot be cast to DAO.
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:
Object[] retornoDaConsulta = query.getResultList().toArray();
for(int i = 0; i < retornoDaConsulta.length; i++){
Object item = (Object[]) retornoDaConsulta[i];
SeuObjeto seuObjeto = new SeuObjeto();
seuObjeto.setAtributoInteger((Integer)item[0]);
seuObjeto.setAtributoString((String)item[1]);
// assim por diante até terminar seus atributos
}
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+
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
cara tem como vc postar o codigo inteiro pra mim dar uma olhada?
Ta ai
[code]public T get(T object) throws Exception {
if (emf != null && emf.isOpen() && em != null && em.isOpen()) {
if(object.getDaoCriteria() == null){
object.setDaoCriteria(new DAOCriteria(object.getClass()));
}
Field[] field = object.getClass().getDeclaredFields();
for (int i = 1; i < field.length; i++) {
Method method = 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)+"'");
}
}
}
String criterios = "";
for(Criterion item : object.getDaoCriteria().getCriterios()){
criterios += "and "+item.toString()+" ";
}
String nomeTabela = object.getClass().getSimpleName().substring(0,1).toLowerCase()+object.getClass().getSimpleName().substring(1);
Query query = em.createNativeQuery("select * from "+nomeTabela+" where 1=1 "+criterios);
T[] lista = (T[]) query.getResultList().toArray();
if(lista.length > 0){
T result = lista[0];
return result;
}
}
return null;
}[/code]
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
Que bom q deu certo cara, caso naum tenha mais duvidas por favor altere o titulo do topico para [RESOLVIDO]