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 Christopher Lowe <c_...@caribsurf.com> on 2006/02/02 22:24:33 UTC

Exception in buildSuperJoinTree() - java.lang.NullPointerException

Hi All,
            I have the following relationship. A Supplier has several
products (Rooms) and each product has several rates. Room is a Product hence
an inheritance relationship between them.  The mappings are defined below.
I'm trying to perform a simple query to return the suppliers with products
where the net rate is not null. The code snippet is defined below.  However
I get a NullPointerException when query is being built. The stack trace is
also defined below.
 
Regards,
Chris.
 
Code Snippet:
 
            broker = PersistenceBrokerFactory.defaultPersistenceBroker();
            
            QueryByCriteria query = new QueryByCriteria(Supplier.class,
null);
            
            Criteria criteria = new Criteria();
            criteria.addNotNull("products.rates.net");
                        
            query.setCriteria(criteria);
            query.addOrderByAscending("name");
            
            results = (List) broker.getCollectionByQuery(query);
 
Mappings:
 
<class-descriptor class="com.dm.beans.Supplier" table="supplier">
    <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" nullable="false" autoincrement="true"/>
    <field-descriptor name="registrationDate" column="REGDATE"
jdbc-type="DATE" />
    <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" />
    <field-descriptor name="contact" column="CONTACT" jdbc-type="VARCHAR" />
    <field-descriptor name="email" column="EMAIL" jdbc-type="VARCHAR" />
    <field-descriptor name="phone" column="PHONE" jdbc-type="VARCHAR" />
    <field-descriptor name="fax" column="FAX" jdbc-type="VARCHAR" />
    <field-descriptor name="active" column="ACTIVE" jdbc-type="BIT" />
    <collection-descriptor
        name="products"
 
collection-class="org.apache.ojb.broker.util.collections.RemovalAwareList"
        element-class-ref="com.dm.beans.Room"
        auto-update="true" 
        auto-delete="true"
        proxy="true"
    >
        <orderby name="name" sort="ASC"/>
        <inverse-foreignkey field-ref="supplierId"/>
    </collection-descriptor>
</class-descriptor>
 
<class-descriptor class="com.dm.beans.Product" table="product">
    <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" nullable="false" autoincrement="true"/>
    <field-descriptor name="supplierId" column="SUPPLIER_ID"
jdbc-type="INTEGER"/>
    <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" />
</class-descriptor>
 
<class-descriptor class="com.dm.beans.Room" table="room">
    <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" nullable="false"/>
    <field-descriptor name="quantity" column="QUANTITY" jdbc-type="INTEGER"
/>
    <field-descriptor name="allocation" column="ALLOCATION"
jdbc-type="INTEGER" />
    <field-descriptor name="capacity" column="CAPACITY" jdbc-type="INTEGER"
/>
    <reference-descriptor 
        name="super" 
        class-ref="com.dm.beans.Product" 
    >
        <foreignkey field-ref="id"/>
    </reference-descriptor>
    <collection-descriptor
         name="rates"
 
collection-class="org.apache.ojb.broker.util.collections.RemovalAwareList"
         element-class-ref="com.dm.beans.Rate"
         auto-update="true"
         auto-delete="true"
         proxy="true"
    >
        <inverse-foreignkey field-ref="productId"/>
    </collection-descriptor>    
</class-descriptor>
 
<class-descriptor class="com.dm.beans.Rate" table="room_rate">
    <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" nullable="false" autoincrement="true"/>
    <field-descriptor name="productId" column="ROOM_ID" jdbc-type="INTEGER"
/>
    <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" />
    <field-descriptor name="startDate" column="START_DATE" jdbc-type="DATE"
/>
    <field-descriptor name="endDate" column="END_DATE" jdbc-type="DATE" />
    <field-descriptor name="net" column="NET" jdbc-type="DOUBLE" />
</class-descriptor>
 
 
Stack Trace:
 
java.lang.NullPointerException
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildSuperJoinTree(U
nknown Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getTableAlias(Unknow
n Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTreeForColu
mn(Unknown Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Unknow
n Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Unknow
n Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(Unknown
Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(Unknown
Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(Unknown
Source)
        at
org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPreparedSel
ectStatement(Unknown Source)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown
Source)
        at
org.apache.ojb.broker.accesslayer.RsQueryObject.performQuery(Unknown Source)
        at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown
Source)
        at
org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(Unknown
Source)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(Unkn
own Source)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Unknow
n Source)
        at
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unknown
Source)
 

Re: Exception in buildSuperJoinTree() - java.lang.NullPointerException

Posted by Armin Waibel <ar...@apache.org>.
Hi Chris,

Christopher Lowe wrote:
> Hi All,
>             I have the following relationship. A Supplier has several
> products (Rooms) and each product has several rates. Room is a Product hence
> an inheritance relationship between them.  The mappings are defined below.
> I'm trying to perform a simple query to return the suppliers with products
> where the net rate is not null. The code snippet is defined below.  However
> I get a NullPointerException when query is being built. The stack trace is
> also defined below.
>  

Seems you stumble across another bug.
I made a bug report
https://issues.apache.org/jira/browse/OJB-94

and add a new test to reproduce your problem 
(..broker.InheritanceMultipleTableTest#testQuery_2)

I assume the bug is specific for "table-per-subclass"-inheritance used 
in 'Room' class.

Thanks again for the detailed description.

regards,
Armin


> Regards,
> Chris.
>  
> Code Snippet:
>  
>             broker = PersistenceBrokerFactory.defaultPersistenceBroker();
>             
>             QueryByCriteria query = new QueryByCriteria(Supplier.class,
> null);
>             
>             Criteria criteria = new Criteria();
>             criteria.addNotNull("products.rates.net");
>                         
>             query.setCriteria(criteria);
>             query.addOrderByAscending("name");
>             
>             results = (List) broker.getCollectionByQuery(query);
>  
> Mappings:
>  
> <class-descriptor class="com.dm.beans.Supplier" table="supplier">
>     <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> primarykey="true" nullable="false" autoincrement="true"/>
>     <field-descriptor name="registrationDate" column="REGDATE"
> jdbc-type="DATE" />
>     <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" />
>     <field-descriptor name="contact" column="CONTACT" jdbc-type="VARCHAR" />
>     <field-descriptor name="email" column="EMAIL" jdbc-type="VARCHAR" />
>     <field-descriptor name="phone" column="PHONE" jdbc-type="VARCHAR" />
>     <field-descriptor name="fax" column="FAX" jdbc-type="VARCHAR" />
>     <field-descriptor name="active" column="ACTIVE" jdbc-type="BIT" />
>     <collection-descriptor
>         name="products"
>  
> collection-class="org.apache.ojb.broker.util.collections.RemovalAwareList"
>         element-class-ref="com.dm.beans.Room"
>         auto-update="true" 
>         auto-delete="true"
>         proxy="true"
>     >
>         <orderby name="name" sort="ASC"/>
>         <inverse-foreignkey field-ref="supplierId"/>
>     </collection-descriptor>
> </class-descriptor>
>  
> <class-descriptor class="com.dm.beans.Product" table="product">
>     <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> primarykey="true" nullable="false" autoincrement="true"/>
>     <field-descriptor name="supplierId" column="SUPPLIER_ID"
> jdbc-type="INTEGER"/>
>     <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" />
> </class-descriptor>
>  
> <class-descriptor class="com.dm.beans.Room" table="room">
>     <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> primarykey="true" nullable="false"/>
>     <field-descriptor name="quantity" column="QUANTITY" jdbc-type="INTEGER"
> />
>     <field-descriptor name="allocation" column="ALLOCATION"
> jdbc-type="INTEGER" />
>     <field-descriptor name="capacity" column="CAPACITY" jdbc-type="INTEGER"
> />
>     <reference-descriptor 
>         name="super" 
>         class-ref="com.dm.beans.Product" 
>     >
>         <foreignkey field-ref="id"/>
>     </reference-descriptor>
>     <collection-descriptor
>          name="rates"
>  
> collection-class="org.apache.ojb.broker.util.collections.RemovalAwareList"
>          element-class-ref="com.dm.beans.Rate"
>          auto-update="true"
>          auto-delete="true"
>          proxy="true"
>     >
>         <inverse-foreignkey field-ref="productId"/>
>     </collection-descriptor>    
> </class-descriptor>
>  
> <class-descriptor class="com.dm.beans.Rate" table="room_rate">
>     <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> primarykey="true" nullable="false" autoincrement="true"/>
>     <field-descriptor name="productId" column="ROOM_ID" jdbc-type="INTEGER"
> />
>     <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR" />
>     <field-descriptor name="startDate" column="START_DATE" jdbc-type="DATE"
> />
>     <field-descriptor name="endDate" column="END_DATE" jdbc-type="DATE" />
>     <field-descriptor name="net" column="NET" jdbc-type="DOUBLE" />
> </class-descriptor>
>  
>  
> Stack Trace:
>  
> java.lang.NullPointerException
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildSuperJoinTree(U
> nknown Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getTableAlias(Unknow
> n Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTreeForColu
> mn(Unknown Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Unknow
> n Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Unknow
> n Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(Unknown
> Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(Unknown
> Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(Unknown
> Source)
>         at
> org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPreparedSel
> ectStatement(Unknown Source)
>         at
> org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown
> Source)
>         at
> org.apache.ojb.broker.accesslayer.RsQueryObject.performQuery(Unknown Source)
>         at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown
> Source)
>         at
> org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(Unknown
> Source)
>         at
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(Unkn
> own Source)
>         at
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Unknow
> n Source)
>         at
> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unknown
> Source)
>  
> 

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