Posta os fontes das 3 classes e também da interface AicFacadeLocal.
H
Hyagomvale
Solução 1
Você não implementou o método find(Object)então o implemente!!!
Solução 2
Você deve definir a class AicFacade como sendo abstrata.
S
staroski
Ele disse que implementou na classe AbstractFacade, que é a superclasse das outras.
Imagino que na interface AicFacadeLocal ele tenha declarado o método find sem ser genérico, aí não casa com o método definido em AbstractFacade.
Vamos esperar ele postar os códigos das classes e interface.
H
Hyagomvale
O problema está aqui public abstract class AbstractFacade<T extends Object>
está faltando um implements AicFacadeLocal
Obs: Retire o implements AicFacadeLocal
do public class AicFacade extends AbstractFacadeSgi<Aic> implements AicFacadeLocal pós com a solução acima o AicFacade já faz ligação com o AicFacadeLocal através da AbstractFacade
H
Hyagomvale
Você pode ter uma encadeação de classe abstratas, ou seja, ter um classe abstrata herdando outra classe abstrata que herda outra classe abstrata …e não causará problema
R
Rodrigo_Marden
Isso não é possível, pois a AbstractFacade não implementa só o AicFacadeLocal, ele faz isso com mais de 15 classes.
R
Rodrigo_Marden
AicFacade:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.com.celg.sessao;importbr.com.celg.entidade.Aic;importbr.com.celg.entidade.Areas;importbr.com.celg.entidade.ClassTaxonomia;importbr.com.celg.entidade.Cr;importbr.com.celg.sessao.interfaceFacade.AicFacadeLocal;importjava.util.List;importjavax.ejb.Stateless;importjavax.persistence.EntityManager;importjavax.persistence.PersistenceContext;/** * * @author Rodrigo */@StatelesspublicclassAicFacadeextendsAbstractFacadeSgi<Aic>implementsAicFacadeLocal{@PersistenceContext(unitName="SGT-SGIPU")privateEntityManagerem;@OverrideprotectedEntityManagergetEntityManager(){returnem;}publicAicFacade(){super(Aic.class);}@Overridepublicintcount(StringconsultarPor,StringparametroConsulta,StringdataRef,Crcr,Areasarea,ClassTaxonomiaidClassTaxonomia){Stringclasse=Aic.class.getName().toString();StringnomePuro=classe.substring(classe.lastIndexOf(".")+1,classe.length());StringBuildersb=newStringBuilder();sb.append("select count(").append(nomePuro.toLowerCase()).append(".codigo) from ").append(nomePuro).append(" ").append(nomePuro.toLowerCase()).append(" ");sb.append(" where 1 = 1 ");if(dataRef!=null&&!dataRef.isEmpty()){sb.append(" and ").append(nomePuro.toLowerCase()).append(".dataRef like :valorDataRef ");}if(cr!=null){sb.append(" and ").append(nomePuro.toLowerCase()).append(".cr.cr = :crId ");}if(area!=null){sb.append(" and ").append(nomePuro.toLowerCase()).append(".cr.idArea.codigo = :areaID ");}if(idClassTaxonomia!=null){sb.append(" and ").append(nomePuro.toLowerCase()).append(".idClassTaxonomia.codigo = :taxonomiaID ");}if(parametroConsulta!=null&&!parametroConsulta.isEmpty()){switch(consultarPor){case"ODEX":sb.append(" and ").append(nomePuro.toLowerCase()).append(".odex like '%").append(parametroConsulta).append("%'");break;default:sb.append(" and ").append(nomePuro.toLowerCase()).append(".").append(consultarPor).append(" = ").append(parametroConsulta);break;}}javax.persistence.Queryq=getEntityManager().createQuery(sb.toString());if(dataRef!=null&&!dataRef.isEmpty()){q.setParameter("valorDataRef",dataRef);}if(cr!=null){q.setParameter("crId",cr.getCr());}if(area!=null){q.setParameter("areaID",area.getCodigo());}if(idClassTaxonomia!=null){q.setParameter("taxonomiaID",idClassTaxonomia.getCodigo());}return((Long)q.getSingleResult()).intValue();}@OverridepublicListfindRange(int[]range,StringconsultarPor,StringparametroConsulta,StringdataRef,Crcr,Areasarea,ClassTaxonomiaidClassTaxonomia){Stringclasse=Aic.class.getName().toString();StringnomePuro=classe.substring(classe.lastIndexOf(".")+1,classe.length());StringBuildersb=newStringBuilder();sb.append("select ").append(nomePuro.toLowerCase()).append(" from ").append(nomePuro).append(" ").append(nomePuro.toLowerCase()).append(" ");sb.append(" where 1 = 1 ");if(dataRef!=null&&!dataRef.isEmpty()){sb.append(" and ").append(nomePuro.toLowerCase()).append(".dataRef like :valorDataRef ");}if(cr!=null){sb.append(" and ").append(nomePuro.toLowerCase()).append(".cr.cr = :crId ");}if(area!=null){sb.append(" and ").append(nomePuro.toLowerCase()).append(".cr.idArea.codigo = :areaID ");}if(idClassTaxonomia!=null){sb.append(" and ").append(nomePuro.toLowerCase()).append(".idClassTaxonomia.codigo = :taxonomiaID ");}if(parametroConsulta!=null&&!parametroConsulta.isEmpty()){switch(consultarPor){case"ODEX":sb.append(" and ").append(nomePuro.toLowerCase()).append(".odex like '%").append(parametroConsulta).append("%'");break;default:sb.append(" and ").append(nomePuro.toLowerCase()).append(".").append(consultarPor).append(" = ").append(parametroConsulta);break;}}sb.append(" order by ").append(nomePuro.toLowerCase()).append(".dataRef ");javax.persistence.Queryq=getEntityManager().createQuery(sb.toString());if(dataRef!=null&&!dataRef.isEmpty()){q.setParameter("valorDataRef",dataRef);}if(cr!=null){q.setParameter("crId",cr.getCr());}if(area!=null){q.setParameter("areaID",area.getCodigo());}if(idClassTaxonomia!=null){q.setParameter("taxonomiaID",idClassTaxonomia.getCodigo());}q.setMaxResults(range[1]-range[0]);q.setFirstResult(range[0]);returnq.getResultList();}}
AicFacadeLocal:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.com.celg.sessao.interfaceFacade;importbr.com.celg.entidade.Aic;importbr.com.celg.entidade.Areas;importbr.com.celg.entidade.ClassTaxonomia;importbr.com.celg.entidade.Cr;importjava.util.List;importjavax.ejb.Local;/** * * @author Rodrigo */@LocalpublicinterfaceAicFacadeLocal{voidcreate(Aicaic);voidedit(Aicaic);voidremove(Aicaic);Aicfind(Objectid);List<Aic>findAll();List<Aic>findRange(int[]range);List<String>findByDataGroup();intcount();publicintcount(StringconsultarPor,StringparametroConsulta,StringdataRef,Crcr,Areasarea,ClassTaxonomiataxonomia);publicListfindRange(int[]i,StringconsultarPor,StringparametroConsulta,StringdataRef,Crcr,Areasarea,ClassTaxonomiataxonomia);publicList<String>consultarClassePorStringDistinct(StringdataRef,Stringquery);}
S
staroski
Tem certeza de que o find da classe AbstractFacade tem a mesma assinatura como você declarou na interface AicFacadeLocal ?
Aic find(Object id);
R
Rodrigo_Marden
AbstractFacadeSgi:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.com.celg.sessao;importfacade.AbstractFacade;importjava.util.Collection;importjava.util.List;importjavax.persistence.EntityManager;importjavax.persistence.TypedQuery;importjavax.persistence.criteria.CriteriaBuilder;importjavax.persistence.criteria.CriteriaQuery;importjavax.persistence.criteria.ParameterExpression;importjavax.persistence.criteria.Predicate;importjavax.persistence.criteria.Root;importjavax.persistence.NoResultException;importjavax.persistence.Query;/** * * @author Rodrigo */publicabstractclassAbstractFacadeSgi<T>extendsAbstractFacade{publicAbstractFacadeSgi(ClassentityClass){super(entityClass);}/** * * caso n?o seja informado parametro de busca n?o realiza busca vazia no * banco * * @param propriedade * @param valor * @param limite * @return */publicList<String>findByDataGroup(){javax.persistence.criteria.CriteriaQuerycq=getEntityManager().getCriteriaBuilder().createQuery();cq.select(cq.from(getClass()).get("dataRef"));cq.distinct(true);returngetEntityManager().createQuery(cq).getResultList();}publicListconsultarClassePorStringDistinct(Stringpropriedade,Stringvalor){CriteriaBuilderbuilder=getEntityManager().getCriteriaBuilder();CriteriaQuerycriteria=builder.createQuery(getClass());Rootroot=criteria.from(getClass());criteria.select(root.get(propriedade));criteria.distinct(true);ParameterExpression<String>parametro=builder.parameter(String.class);criteria.where(builder.like(builder.lower(root.get(propriedade)),builder.lower(parametro)));criteria.orderBy(getEntityManager().getCriteriaBuilder().asc(root.get(propriedade)));TypedQueryquery=getEntityManager().createQuery(criteria);query.setParameter(parametro,"%"+valor+"%");// query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheThenDatabase);returnquery.getResultList();}}
R
Rodrigo_Marden
Sim, o código do AbstractFacade ultrapassa o limite permitido aqui, vou postar apenas o find:
Sugiro modificar sua interface AicFacadeLocal para ser genérica e também retornar o tipo genérico ao invés de Aic
R
Rodrigo_Marden
Mas tipo, quando eu herdo a AbstractFacade direto, sem precisar passar pela AbstractFacadeSgi, ela funciona normal.
Exatamente como está o código ai.
S
staroski
O problema não é o extends
O problema é o implements AicFacadeLocal
Nessa interface o método find tem retorno definido como sendo um Aic
publicAicfind(Objectid);
Acontece que na sua superclasse o find tá implementado com retorno de tipo genérico
publicTfind(Objectid);
Tenha em mente que os tipos genéricos só existem em tempo de compilação, no bytecode gerado os tipos genéricos viram tudo Object, esse processo é chamado de Erasure.
Então o que acontece é que quando você implementa AicFacadeLocal, o compilador espera que você tenha um método com a seguinte assinatura:
publicAicfind(Objectid);
mas na verdade você tem um método com essa assinatura:
publicObjectfind(Objectid);
R
Rodrigo_Marden
Mas porque então está funcionando dessa forma quando eu utilizo da seguinte forma:
Pq dessa forma você está especificando que você estende um AbstractFacade<Aic>
Eu não havia reparado que no AbstractFacadeSgi você esqueceu de pôr o extends AbstractFacade<T>.
Você só pôs extends AbstractFacade
Corrige o extends que vai funcionar.
Uma pergunta:
Qual a necessidade de tantos níveis hierárquicos?
R
Rodrigo_Marden1 like
É porque na empresa se utiliza um “framework” criado que realiza a maioria das consultas que precisamos, mas quando precisamos de algo especifico daquele sistema, colocamos mais um nível e é implementado apenas nesse sistema.