Olá.
Não manjo muito de JPA (na verdade eu não conheço quase nada de JPA, sempre usei JDBC puro e estou num projeto que usa JPA hehe).
Tenho o seguinte método:
private Boolean isSectionAlreadyAffected(final String section) {
final LocalizationDAO locDao = new LocalizationDAO();
locDao.getEntityManager();
final Map<String, Object> params = new HashMap<String, Object>();
params.put("section", "5322");
params.put("damageInformation.damage.event.id", "2383");
final List<Localization> foundLocs = locDao.findByParameter(params);
return (null != foundLocs) ? !foundLocs.isEmpty() : false;
}
A modelagem está assim:
Event > Damage > DamageInformation > Localization
Estou partindo de Localization e quero chegar em Event (sentido contrário: Event < Damage < DamageInformation < Localization).
O DAO genérico está assim:
public List<T> findByParameter(Map<String, Object> params) {
String sql = "SELECT o FROM " + getTypeClass().getName() + " o ";
if (params.size() > 0) {
sql += "where ";
}
for (Map.Entry<String, Object> param : params.entrySet()) {
sql += "o." + param.getKey() + " = :" + param.getKey() + " and ";
}
if (params.size() > 0) {
sql = sql.substring(0, sql.length() - 4 );
}
System.out.println(entityManager.isOpen());
System.out.println("*** " + sql + " ***");
Query query = entityManager.createQuery(sql);
for (Map.Entry<String, Object> param : params.entrySet()) {
query.setParameter(param.getKey(), param.getValue());
}
return query.getResultList();
}
Quando chega na linha Query query = entityManager.createQuery(sql); dá NullPointerException.
Quando executo apenas com um parâmetro (params.put("section", "5322");) funciona.
Então não é problema com o EntityManager.
Saída no console:
true
*** SELECT o FROM br.com.Localization o where o.damageInformation.damage.event.id = :damageInformation.damage.event.id and o.section = :section ***
StackTrace:
07/12/2016 08:36:17 com.sun.faces.lifecycle.InvokeApplicationPhase execute AVISO: #{eventHandler.save}: java.lang.NullPointerException javax.faces.FacesException: #{eventHandler.save}: java.lang.NullPointerException at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:78) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:662) Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) … 27 more Caused by: java.lang.NullPointerException at org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:560) at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4774) at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExprLhs(HqlSqlBaseWalker.java:5300) at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4759) at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExprLhs(HqlSqlBaseWalker.java:5300) at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4759) at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1326) at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4471) at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3947) at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2047) at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1972) at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:831) at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:617) at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244) at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:256) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138) at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101) at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80) at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124) at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770) at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:277) at br.com.dao.GenericDAO.findByParameter(GenericDAO.java:83) at br.com.business.impl.LocalizationBusiness.isSectionAlreadyAffected(LocalizationBusiness.java:89) at br.com.business.impl.LocalizationBusiness.getAffectedDamages(LocalizationBusiness.java:47) at br.com.business.impl.LocalizationBusiness.checkIfDamageAlreadyExistsInAirplaneSection(LocalizationBusiness.java:31) at br.combusiness.impl.EventBusiness.save(EventBusiness.java:29) at br.com.view.handler.EventHandler.save(EventHandler.java:668) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.el.parser.AstValue.invoke(AstValue.java:278) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) … 28 more
Quando monto a query na mão e rodo no banco, funciona (com os mesmos parâmetros):
select e.*, l.COD_SECAO from
tbl_local l,
tbl_info_dano i_d,
tbl_dano d,
tbl_evnt e
where
l.COD_SECAO = '5322' and
l.COD_INFO_DANO = i_d.COD_INFO_DANO and
i_d.COD_INFO_DANO = d.COD_INFO_DANO and
d.COD_EVNT = e.COD_EVNT and
e.COD_EVNT = '2383';
Estou apenas dando manutenção no projeto. Ele funciona 100% em relação ao JPA. Não é problema de configuração. Não comecei do zero. Apenas criei aquele primeiro método e estou tentando executar uma query.
Qualquer ajuda é bem vinda.
Obrigado!