Update part 2: I now believe this to be a bug. I am currently using rc5.
I have debugged and ended up replacing the line that retrieves the base_alias in the buildSuperJoinTree method of SqlQueryStatement. My code is in between the *********** rows. I have not tested it thoroughly nor have I looked at the ramifications that I could have on other code. I am merely suggesting it as a potential fix to a potential bug. I am requesting someone please look at this case and (a) verify that it is a bug and (b) verify that my fix is a valid fix. My code for the method would be: protected void buildSuperJoinTree( TableAlias left, ClassDescriptor cld, String name ) { Iterator objRefs = cld.getObjectReferenceDescriptors().iterator(); while( objRefs.hasNext() ) { ObjectReferenceDescriptor objRef = (ObjectReferenceDescriptor) objRefs.next(); FieldDescriptor[] leftFields = objRef.getForeignKeyFieldDescriptors(cld); ClassDescriptor refCld = cld.getRepository().getDescriptorFor(objRef.getItemClassName()); if (objRef.getPersistentField() instanceof AnonymousPersistentFieldForInheritance) { /**********************/ //The other methods store the alias/path in the map using only the first part of // the path string as the key. e.g. "objectA" instead of "objectA.objectB" // This fix takes the first part of the existing path string. String shrtName = name; int sepPos = shrtName.indexOf("."); if (sepPos >= 0){ shrtName = shrtName.substring(0, sepPos); } TableAlias base_alias = getTableAliasForPath( shrtName, null ); //commented out the old version //TableAlias base_alias = getTableAliasForPath( name, null ); /**********************/ String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++; TableAlias right = new TableAlias( refCld, aliasName, false, null ); Join join1to1 = new Join(left, leftFields, right, refCld.getPkFields(), false, "superClass"); base_alias.addJoin( join1to1 ); buildSuperJoinTree( right, refCld, name); } } } -----Original Message----- From: Phil Armour Sent: Monday, April 12, 2004 1:50 PM To: OJB Users List Subject: RE: addEqualTo throws Exception on 2-deep reference-descriptor Update on my search: I have began going through the source and the null pointer is a result of the following line in buildSuperJoinTree() in class SqlQueryStatement: TableAlias base_alias = getTableAliasForPath( name, null ); What is happening is that the variable 'name' is set to the value: "mStakeholder.mTopicsOfInterest" The result of calling the method getTableAliasForPath with that string is a null value is set to base_alias. This obviously results in a NPE. If someone could advise me which direction I should look for the problem from here. I see it as two options: check the getTableAliasForPath() method to see why it returns null; Find out why the variable name is set to "mStakeholder.mTopicsOfInterest". Thanks. -----Original Message----- From: Phil Armour Sent: Monday, April 12, 2004 12:12 PM To: [EMAIL PROTECTED] Subject: addEqualTo throws Exception on 2-deep reference-descriptor Hi, I am getting a null pointer exception when adding an EqualTo query term that references the second embedded object. For example: I have a Contact object that contains a reference-descriptor to a Stakeholder. This stakeholder then contains a collection-descriptor to other Objects (TopicsOfInterest). What I am trying to do is add the following criteria term: crit.addEqualTo("mStakeholder.mTopicsOfInterest.mId",new Long(getDdid())); The Exception I get is: java.lang.NullPointerException at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildSuperJoinTr ee(SqlQueryStatement.java:1531) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getTableAlias(Sq lQueryStatement.java:1006) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTreeFor Column(SqlQueryStatement.java:1501) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq lQueryStatement.java:1478) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq lQueryStatement.java:1467) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Sq lQueryStatement.java:1556) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS tatement.java:155) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS tatement.java:111) at org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelec tStatement.java:89) at org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPrepare dSelectStatement(SqlGeneratorDefaultImpl.java:196) at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccess Impl.java:306) at org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:209) at org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIter atorFactoryImpl.java:95) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery( PersistenceBrokerImpl.java:2426) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Pe rsistenceBrokerImpl.java:1766) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1372) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1563) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1599) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1588) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu ery(DelegatingPersistenceBroker.java:322) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu ery(DelegatingPersistenceBroker.java:322) at appian.tracking.services.TrackingService.getCollection(TrackingService.j ava:94) at appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3 58) at appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3 36) at appian.tracking.cases.case056.TOISearch.generate(TOISearch.java:62) at appian.tracking.actions.CustomCaseReportAction.execute(CustomCaseReportA ction.java:40) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestPr ocessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java: 274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:743) at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:284) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at appian.tracking.util.loginFilter.doFilter(loginFilter.java:104) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:233) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv e.java:257) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardCon textValve.java:245) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv e.java:199) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java :195) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java :164) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:149) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:156) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:82 8) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processC onnection(Http11Protocol.java:700) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:58 4) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool .java:683) at java.lang.Thread.run(Thread.java:534) rethrown as org.apache.ojb.broker.PersistenceBrokerException at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1570) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1599) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1588) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu ery(DelegatingPersistenceBroker.java:322) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu ery(DelegatingPersistenceBroker.java:322) at appian.tracking.services.TrackingService.getCollection(TrackingService.j ava:94) at appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3 58) at appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3 36) at appian.tracking.cases.case056.TOISearch.generate(TOISearch.java:62) at appian.tracking.actions.CustomCaseReportAction.execute(CustomCaseReportA ction.java:40) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestPr ocessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java: 274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:743) at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:284) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at appian.tracking.util.loginFilter.doFilter(loginFilter.java:104) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:233) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv e.java:257) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardCon textValve.java:245) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv e.java:199) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java :195) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java :164) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:149) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:156) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:82 8) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processC onnection(Http11Protocol.java:700) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:58 4) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool .java:683) at java.lang.Thread.run(Thread.java:534) Caused by: java.lang.NullPointerException at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildSuperJoinTr ee(SqlQueryStatement.java:1531) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getTableAlias(Sq lQueryStatement.java:1006) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTreeFor Column(SqlQueryStatement.java:1501) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq lQueryStatement.java:1478) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq lQueryStatement.java:1467) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Sq lQueryStatement.java:1556) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS tatement.java:155) at org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS tatement.java:111) at org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelec tStatement.java:89) at org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPrepare dSelectStatement(SqlGeneratorDefaultImpl.java:196) at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccess Impl.java:306) at org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:209) at org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIter atorFactoryImpl.java:95) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery( PersistenceBrokerImpl.java:2426) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Pe rsistenceBrokerImpl.java:1766) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1372) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe rsistenceBrokerImpl.java:1563) ... 42 more I have no problems when querying for Stakeholders given the TopicOfInterest or for Contacts given the Stakeholder. My problem only arises when going the extra level of depth. Such a query seems like a common requirement so I am wondering if anyone has encountered this error, or more likely, can point out where I am missing something obvious. Further I tested with just a regular reference-descriptor (instead of the collection) and got the same error. Another note is that the Contact and Stakeholder are implementations of an abstract class and they each use separate tables. _________________________________________ Phil Armour --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]