You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Reda Benzair <re...@smartjog.com> on 2004/10/08 09:08:57 UTC

java.lang.NullPointerException for SqlQueryStatement

Hi,
 
I am facing a problem you already encountered, but don't seem to find a 
solution.
*SUMMARY*
I would like to include a reportQuery that returns only one attribute 
inside a Criteria :
 
*EXISTING*
 
Using OJB 1.0, on JDK 1.4.2 (with Tomcat 4.1.30)
 
Tables:

    * A Company has a name
    * An Employee has a name
    * An Employee has a Company

class Company
{
    Integer cpyId; //the ID
    String name;  //the name
 
    /* Collection of employees*/
    Employee[] employees;
}
 
class Employee
{
    Integer empId; //the ID
    String name;  //the name
 
    /*  Reference to a company */
    Integer cpyId;
    Company company;
}
 
Mapping:
In fact, Company is an interface with one single extent CompanyImpl.
Employee is an interface with one single extent EmployeeImpl.
 
------------------------------------------------------------------------
*PROBLEM*
I want to get all the user with an 'A' in their name, and who belong to 
a company with a 'B' in its name.
 
I know it could be done like this:
 

    Criteria crit = new Criteria();
    crit.addLike("company.name", "%B%");
    crit.addLike("name", "%A%");
    broker.getIteratorByQuery(new QueryByCriteria(Employee.class, crit));

but this is a simple exemple to help you understand my problem. I'm 
trying to use a subquery (because my subquery is much more complex than 
a simple like)

    Criteria compCrit = new Criteria();
    compCrit.addLike("name", "%B%");
    Query empQuery = new QueryByCriteria(Employee.class, crit);
     
    Criteria empCrit = new Criteria();
    empCrit.addLike("name", "%A%");
     
    ReportQueryByCriteria subQuery = new
    ReportQueryByCriteria(Company.class, compCrit);
    subQuery.setAttributes(new String[] {"cpyId"});
     
    empCrit.addIn("cpyId", subQuery);
     
    broker.getIteratorByQuery(empQuery);

This second piece of code generate a NullPointerException :
 

java.lang.NullPointerException

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement$TableAlias.hashCode(SqlQueryStatement.java:1920)

at java.util.HashMap.hash(HashMap.java:261)

at java.util.HashMap.put(HashMap.java:379)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(SqlQueryStatement.java:1630)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryStatement.java:130)

at 
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelectStatement.java:64)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getSubQuerySQL(SqlQueryStatement.java:910)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSubQuery(SqlQueryStatement.java:891)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendParameter(SqlQueryStatement.java:876)

at org.apache.ojb.broker.accesslayer.sql.SqlQueryState 
ment.appendInCriteria(SqlQueryStatement.java:704)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendCriteria(SqlQueryStatement.java:783)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSQLClause(SqlQueryStatement.java:856)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.asSQLStatement(SqlQueryStatement.java:609)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendClause(SqlQueryStatement.java:532)

at 
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendWhereClause(SqlQueryStatement.java:484)

at 
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.getStatement(SqlSelectStatement.java:251)

at 
org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPreparedSelectStatement(SqlGeneratorDefaultImpl.java:151)

at 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccessImpl.java:276)

at org.apache.ojb.broker.accesslayer.RsQueryObject.perfo 
rmQuery(RsQueryObject.java:74)

at org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:183)

at 
org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIteratorFactoryImpl.java:58)

at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(PersistenceBrokerImpl.java:1831)

at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(PersistenceBrokerImpl.java:1331)

at 
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:111)

at 
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:233)

at 
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:253)

at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1215)

at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(DelegatingPersi 
stenceBroker.java:338)

at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(DelegatingPersistenceBroker.java:338)

In fact, in this case, I would simply like OJB to retreive all the 
Employee that are returned by

select * from employee where name like '%A%' and cpyId in (select cpyId from company where name like '%B%')

 
I've found out you faced exactly the same problem, in a thread entitled 
"SqlQueryStatement.splitCriteria -> NullPointerException". Did you reach 
a solution?


thinks all

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: java.lang.NullPointerException for SqlQueryStatement

Posted by Reda Benzair <re...@smartjog.com>.
Reda Benzair wrote:

> Jakob Braeuchi wrote:
>
>> hi reda,
>>
>> the problem is imo that the subqueries are not extent aware (as 
>> mentioned in the other post about splitCriteria).
>>
>> i suggest you separate the queries. the first one retrieves all the 
>> ids and the second uses these ids in an IN-clause:
>>
>> ReportQueryByCriteria subQuery = new 
>> ReportQueryByCriteria(Company.class, compCrit);
>> subQuery.setAttributes(new String[] {"cpyId"});
>> Iterator subIter = broker.getReportQueryIteratorByQuery(subQuery);
>> Collection subIds = new ArrayList();
>> while (subIter.hasNext())
>> {
>>     Object[] id = (Object[])subIter.next();
>>     subIds.add(id[0]);
>> }
>>
>> Query empQuery = new QueryByCriteria(Employee.class, crit);
>> Criteria empCrit = new Criteria();
>> empCrit.addLike("name", "%A%");
>> empCrit.addIn("cpyId", subIds);
>>
>> hth
>> jakob
>>
>> Reda Benzair schrieb:
>>
>>> Hi,
>>>
>>> I am facing a problem you already encountered, but don't seem to 
>>> find a solution.
>>> *SUMMARY*
>>> I would like to include a reportQuery that returns only one 
>>> attribute inside a Criteria :
>>>
>>> *EXISTING*
>>>
>>> Using OJB 1.0, on JDK 1.4.2 (with Tomcat 4.1.30)
>>>
>>> Tables:
>>>
>>>    * A Company has a name
>>>    * An Employee has a name
>>>    * An Employee has a Company
>>>
>>> class Company
>>> {
>>>    Integer cpyId; //the ID
>>>    String name;  //the name
>>>
>>>    /* Collection of employees*/
>>>    Employee[] employees;
>>> }
>>>
>>> class Employee
>>> {
>>>    Integer empId; //the ID
>>>    String name;  //the name
>>>
>>>    /*  Reference to a company */
>>>    Integer cpyId;
>>>    Company company;
>>> }
>>>
>>> Mapping:
>>> In fact, Company is an interface with one single extent CompanyImpl.
>>> Employee is an interface with one single extent EmployeeImpl.
>>>
>>> ------------------------------------------------------------------------ 
>>>
>>> *PROBLEM*
>>> I want to get all the user with an 'A' in their name, and who belong 
>>> to a company with a 'B' in its name.
>>>
>>> I know it could be done like this:
>>>
>>>
>>>    Criteria crit = new Criteria();
>>>    crit.addLike("company.name", "%B%");
>>>    crit.addLike("name", "%A%");
>>>    broker.getIteratorByQuery(new QueryByCriteria(Employee.class, 
>>> crit));
>>>
>>> but this is a simple exemple to help you understand my problem. I'm 
>>> trying to use a subquery (because my subquery is much more complex 
>>> than a simple like)
>>>
>>>    Criteria compCrit = new Criteria();
>>>    compCrit.addLike("name", "%B%");
>>>    Query empQuery = new QueryByCriteria(Employee.class, crit);
>>>        Criteria empCrit = new Criteria();
>>>    empCrit.addLike("name", "%A%");
>>>        ReportQueryByCriteria subQuery = new
>>>    ReportQueryByCriteria(Company.class, compCrit);
>>>    subQuery.setAttributes(new String[] {"cpyId"});
>>>        empCrit.addIn("cpyId", subQuery);
>>>        broker.getIteratorByQuery(empQuery);
>>>
>>> This second piece of code generate a NullPointerException :
>>>
>>>
>>> java.lang.NullPointerException
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement$TableAlias.hashCode(SqlQueryStatement.java:1920) 
>>>
>>>
>>> at java.util.HashMap.hash(HashMap.java:261)
>>>
>>> at java.util.HashMap.put(HashMap.java:379)
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(SqlQueryStatement.java:1630) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryStatement.java:130) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelectStatement.java:64) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getSubQuerySQL(SqlQueryStatement.java:910) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSubQuery(SqlQueryStatement.java:891) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendParameter(SqlQueryStatement.java:876) 
>>>
>>>
>>> at org.apache.ojb.broker.accesslayer.sql.SqlQueryState 
>>> ment.appendInCriteria(SqlQueryStatement.java:704)
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendCriteria(SqlQueryStatement.java:783) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSQLClause(SqlQueryStatement.java:856) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.asSQLStatement(SqlQueryStatement.java:609) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendClause(SqlQueryStatement.java:532) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendWhereClause(SqlQueryStatement.java:484) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.getStatement(SqlSelectStatement.java:251) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPreparedSelectStatement(SqlGeneratorDefaultImpl.java:151) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccessImpl.java:276) 
>>>
>>>
>>> at org.apache.ojb.broker.accesslayer.RsQueryObject.perfo 
>>> rmQuery(RsQueryObject.java:74)
>>>
>>> at 
>>> org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:183) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIteratorFactoryImpl.java:58) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(PersistenceBrokerImpl.java:1831) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(PersistenceBrokerImpl.java:1331) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:111) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:233) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:253) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1215) 
>>>
>>>
>>> at 
>>> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(DelegatingPersi 
>>> stenceBroker.java:338)
>>>
>>> at 
>>> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(DelegatingPersistenceBroker.java:338) 
>>>
>>>
>>> In fact, in this case, I would simply like OJB to retreive all the 
>>> Employee that are returned by
>>>
>>> select * from employee where name like '%A%' and cpyId in (select 
>>> cpyId from company where name like '%B%')
>>>
>>>
>>> I've found out you faced exactly the same problem, in a thread 
>>> entitled "SqlQueryStatement.splitCriteria -> NullPointerException". 
>>> Did you reach a solution?
>>>
>>>
>>> thinks all
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>
>
> Thank you Jakob,
>  
> I had already used the workaround you propose, but I'd rather use one 
> single, "clean" query.
> Will subqueries be extent-aware in future releases?
>  
> Thank you again,
>


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: java.lang.NullPointerException for SqlQueryStatement

Posted by Jakob Braeuchi <jb...@gmx.ch>.
hi reda,

the problem is imo that the subqueries are not extent aware (as mentioned in the 
other post about splitCriteria).

i suggest you separate the queries. the first one retrieves all the ids and the 
second uses these ids in an IN-clause:

ReportQueryByCriteria subQuery = new ReportQueryByCriteria(Company.class, compCrit);
subQuery.setAttributes(new String[] {"cpyId"});
Iterator subIter = broker.getReportQueryIteratorByQuery(subQuery);
Collection subIds = new ArrayList();
while (subIter.hasNext())
{
     Object[] id = (Object[])subIter.next();
     subIds.add(id[0]);
}

Query empQuery = new QueryByCriteria(Employee.class, crit);
Criteria empCrit = new Criteria();
empCrit.addLike("name", "%A%");
empCrit.addIn("cpyId", subIds);

hth
jakob

Reda Benzair schrieb:

> Hi,
> 
> I am facing a problem you already encountered, but don't seem to find a 
> solution.
> *SUMMARY*
> I would like to include a reportQuery that returns only one attribute 
> inside a Criteria :
> 
> *EXISTING*
> 
> Using OJB 1.0, on JDK 1.4.2 (with Tomcat 4.1.30)
> 
> Tables:
> 
>    * A Company has a name
>    * An Employee has a name
>    * An Employee has a Company
> 
> class Company
> {
>    Integer cpyId; //the ID
>    String name;  //the name
> 
>    /* Collection of employees*/
>    Employee[] employees;
> }
> 
> class Employee
> {
>    Integer empId; //the ID
>    String name;  //the name
> 
>    /*  Reference to a company */
>    Integer cpyId;
>    Company company;
> }
> 
> Mapping:
> In fact, Company is an interface with one single extent CompanyImpl.
> Employee is an interface with one single extent EmployeeImpl.
> 
> ------------------------------------------------------------------------
> *PROBLEM*
> I want to get all the user with an 'A' in their name, and who belong to 
> a company with a 'B' in its name.
> 
> I know it could be done like this:
> 
> 
>    Criteria crit = new Criteria();
>    crit.addLike("company.name", "%B%");
>    crit.addLike("name", "%A%");
>    broker.getIteratorByQuery(new QueryByCriteria(Employee.class, crit));
> 
> but this is a simple exemple to help you understand my problem. I'm 
> trying to use a subquery (because my subquery is much more complex than 
> a simple like)
> 
>    Criteria compCrit = new Criteria();
>    compCrit.addLike("name", "%B%");
>    Query empQuery = new QueryByCriteria(Employee.class, crit);
>        Criteria empCrit = new Criteria();
>    empCrit.addLike("name", "%A%");
>        ReportQueryByCriteria subQuery = new
>    ReportQueryByCriteria(Company.class, compCrit);
>    subQuery.setAttributes(new String[] {"cpyId"});
>        empCrit.addIn("cpyId", subQuery);
>        broker.getIteratorByQuery(empQuery);
> 
> This second piece of code generate a NullPointerException :
> 
> 
> java.lang.NullPointerException
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement$TableAlias.hashCode(SqlQueryStatement.java:1920) 
> 
> 
> at java.util.HashMap.hash(HashMap.java:261)
> 
> at java.util.HashMap.put(HashMap.java:379)
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(SqlQueryStatement.java:1630) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryStatement.java:130) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelectStatement.java:64) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getSubQuerySQL(SqlQueryStatement.java:910) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSubQuery(SqlQueryStatement.java:891) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendParameter(SqlQueryStatement.java:876) 
> 
> 
> at org.apache.ojb.broker.accesslayer.sql.SqlQueryState 
> ment.appendInCriteria(SqlQueryStatement.java:704)
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendCriteria(SqlQueryStatement.java:783) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSQLClause(SqlQueryStatement.java:856) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.asSQLStatement(SqlQueryStatement.java:609) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendClause(SqlQueryStatement.java:532) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendWhereClause(SqlQueryStatement.java:484) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.getStatement(SqlSelectStatement.java:251) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPreparedSelectStatement(SqlGeneratorDefaultImpl.java:151) 
> 
> 
> at 
> org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccessImpl.java:276) 
> 
> 
> at org.apache.ojb.broker.accesslayer.RsQueryObject.perfo 
> rmQuery(RsQueryObject.java:74)
> 
> at org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:183)
> 
> at 
> org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIteratorFactoryImpl.java:58) 
> 
> 
> at 
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(PersistenceBrokerImpl.java:1831) 
> 
> 
> at 
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(PersistenceBrokerImpl.java:1331) 
> 
> 
> at 
> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:111) 
> 
> 
> at 
> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:233) 
> 
> 
> at 
> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryReferenceBroker.java:253) 
> 
> 
> at 
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1215) 
> 
> 
> at 
> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(DelegatingPersi 
> stenceBroker.java:338)
> 
> at 
> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(DelegatingPersistenceBroker.java:338) 
> 
> 
> In fact, in this case, I would simply like OJB to retreive all the 
> Employee that are returned by
> 
> select * from employee where name like '%A%' and cpyId in (select cpyId 
> from company where name like '%B%')
> 
> 
> I've found out you faced exactly the same problem, in a thread entitled 
> "SqlQueryStatement.splitCriteria -> NullPointerException". Did you reach 
> a solution?
> 
> 
> thinks all
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org