You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by Jakob Braeuchi <jb...@gmx.ch> on 2003/08/15 21:42:24 UTC

Re: [anonymous fields] querying fields of "Multiple Joined Tables"

hi kurt,

do you really use the table name in ...where PROFILE.name=$1")  ??


jakob

Kurt Hoehn wrote:

>Hello,
>
>I'm new to the group and the ojb stuff, but I noticed that only the
>ObjectReferenceDescriptor using the name of super will have a null for the
>name of the persistent field. This is what I did to get it to work, its not
>pretty and I don't know if I'm going down the right path but I used the
>extends in the class descriptor and used the refrence-descriptor of super to
>get a 1:1 relationship.
>
>            OQLQuery query = odmg.newOQLQuery();
>            query.create( "select all from " + Branch.class.getName() + "
>where PROFILE.name=$1");
>            query.bind("Army");
>
><class-descriptor class="com.etranscor.ojb.terminal.Profile"
>table="PROFILE">
>        <field-descriptor name="profileId"
>                          column="PROFILE_ID"
>                          jdbc-type="INTEGER"
>                          primarykey="true"
>                          nullable="false"
>                          autoincrement="true"
>                          sequence-name="TERMINAL_GENERATOR"/>
>        <field-descriptor name="name"
>                          column="NAME"
>                          jdbc-type="VARCHAR"
>                          nullable="false"
>                          length="200"/>
>        <field-descriptor name="status"
>                          column="STATUS"
>                          jdbc-type="CHAR"
>                          nullable="false"
>                          length="1"/>
>        <field-descriptor name="lastUpdateTime"
>                          column="LAST_UPDATE_TIME"
>                          jdbc-type="TIMESTAMP"
>                          nullable="false"/>
>    </class-descriptor>
><!-- Definitions for com.etranscor.ojb.terminal.military.Branch -->
>    <class-descriptor class="com.etranscor.ojb.terminal.military.Branch"
>                      table="BRANCH"
>                      extends="com.etranscor.ojb.terminal.Profile">
>        <field-descriptor name="profileId"
>                          column="PROFILE_ID"
>                          jdbc-type="INTEGER"
>                          primarykey="true"
>                          nullable="false"
>                          autoincrement="true"
>                          sequence-name="TERMINAL_GENERATOR"/>
>        <field-descriptor name="code"
>                          column="CODE"
>                          jdbc-type="CHAR"
>                          length="2"
>                          nullable="false"/>
>
>        <reference-descriptor name="super"
>class-ref="com.etranscor.ojb.terminal.Profile">
>            <foreignkey field-ref="profileId"/>
>        </reference-descriptor>
>        <collection-descriptor name="regions"
> 
>element-class-ref="com.etranscor.ojb.terminal.military.Region"
>                               refresh="true"
>                               proxy="true"
>                               auto-retrieve="true">
>            <inverse-foreignkey field-ref="branchId"/>
>        </collection-descriptor>
>    </class-descriptor>
>
>
>Here are the methods in the SqlSelectStatement.java
>
>    private void appendSuperClassJoin(ClassDescriptor cld, ClassDescriptor
>cldSuper, StringBuffer stmt, StringBuffer where)
>    {
>        stmt.append(",").append(cldSuper.getFullTableName());
>        if(where != null && where.length() > 0){
>            where.append(" AND ");
>        }
>
>        // get reference field in super class
>        Iterator objRefs = cld.getObjectReferenceDescriptors().iterator();
>        while( objRefs.hasNext() )
>        {
>            ObjectReferenceDescriptor superRef = (ObjectReferenceDescriptor)
>objRefs.next();
>            if( superRef.getPersistentField().getName() == null )
>            {
>                Iterator itr = superRef.getForeignKeyFields().iterator();
>                while( itr.hasNext() )
>                {
>                    FieldDescriptor field = cld.getFieldDescriptorByName(
>(String) itr.next() );
> 
>where.append(cldSuper.getFullTableName()).append(".").append(
>cldSuper.getPrimaryKey().getColumnName() );
>                    where.append(" = ");
>                    where.append(cld.getFullTableName()).append(".").append(
>field.getColumnName() );
>
>                    if( itr.hasNext() )
>                    {
>                        where.append(" AND ");
>                    }
>                }
>
>	  	    break;
>            }
>        }
>    }
>
>    private void appendSuperClassColumns(ClassDescriptor cldSub,
>ClassDescriptor cldSuper, StringBuffer buf)
>    {
>        FieldDescriptor[] fields = cldSuper.getFieldDescriptions();
>        for (int i = 0; i < fields.length; i++)
>        {
>            FieldDescriptor field = fields[i];
>
>		  //Bad 
>             if (i >= 0)
>                {
>                    buf.append(",");
>                }
>                buf.append(cldSuper.getFullTableName());
>                buf.append(".");
>                buf.append(field.getColumnName());
>                //columnList.add(field.getAttributeName());
>
>        }
>
>    }
>
>This works but I noticed that aliasing could be come an issue, and are they
>going to be deprecating extends in the class-descriptor, sorry about all the
>code.
>
>-kurt
>
>
>-----Original Message-----
>From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] 
>Sent: Friday, August 15, 2003 2:28 PM
>To: OJB Developers List
>Cc: houari.tine@ca-cedicam.fr
>Subject: [anonymous fields] querying fields of "Multiple Joined Tables" 
>
>hi all,
>
>armin found a problem in the testcase which uses attributes of the super 
>class in a query.
>the situation is as follows:
>
> <class-descriptor
>        class="org.apache.ojb.broker.ObjectRepository$E"
>        table="TABLE_E">
> ...
>        <field-descriptor
>            name="someSuperValue"
>            column="SOMESUPERVALUE"
>            jdbc-type="INTEGER"
>        />
>
> </class-descriptor>
>
> <class-descriptor
>        class="org.apache.ojb.broker.ObjectRepository$F"
>        table="TABLE_F">
>...
>        <field-descriptor
>            name="eID"
>            column="E_ID"
>            jdbc-type="INTEGER"
>            access="anonymous"
>        />
>
>        <field-descriptor
>            name="someValue"
>            column="SOMEVALUE"
>            jdbc-type="INTEGER"
>        />
>
>          <reference-descriptor name="super"
>              class-ref="org.apache.ojb.broker.ObjectRepository$E"
>            <foreignkey field-ref="eID" />
>          </reference-descriptor>
>    </class-descriptor>
>
>
>when querying for 'F' using attributes of 'F' (someValue) everything is 
>ok. but using attributes of the super E (someSuperValue) does not work 
>because there's no real relationship between 'F' and 'E'.
>i could solve the problem by adding the name 'super' to the appropriate 
>anonymous field:
>
>   public AnonymousPersistentFieldForInheritance(ClassDescriptor cld)
>   {
>       super("super");
>       this.cld = cld;
>   }
>
>in the query the attribute of class 'E' has to be prefixed by 'super':
>
>       c.addEqualTo("super.someSuperValue", new Integer(key2));
>
>this works, but we loose transparency :(
>
>what do you think ???
>
>jakob
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
>  
>


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


Re: [anonymous fields] querying fields of "Multiple Joined Tables"

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

fyi using 'super.' as prefix of attributes of super class may cause 
problems with extents because the class referncing super is also an 
extent of this class.
i'll check kurt's solution as soon as i receive the complete class.

jakob



Jakob Braeuchi wrote:

> hi all,
>
> i just commited a patch which allows referencing attributes of the 
> super class by prefixing them with 'super.'
> see AnonymousFieldsTest#testQuerySuperField:
> ...
>        Criteria c = new Criteria();
>        c.addEqualTo("super.someSuperValue", new Integer(key2));
>        Query q = QueryFactory.newQuery(ObjectRepository.F.class, c);
>        Collection result = broker.getCollectionByQuery(q);
> ...
>
> i will check kurt's solution as soon as time permits. this feature is 
> also not yet documented !
>
> jakob
>
>
> Kurt Hoehn wrote:
>
>> I did but this could cause an alias problem so its not good but I 
>> have a way
>> now of getting to the super class then I can check to see if the 
>> property of
>> "name" exists then alias the super classes table name so I wont need to
>> alias the table name in the query.  This is not a production 
>> statement more
>> of a proof of concept that I'm doing, checking to see if ojb is a 
>> good fit
>> in our environment.
>>
>> -kurt
>>
>>
>> -----Original Message-----
>> From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] Sent: Friday, August 
>> 15, 2003 3:42 PM
>> To: OJB Developers List
>> Subject: Re: [anonymous fields] querying fields of "Multiple Joined 
>> Tables"
>>
>> hi kurt,
>>
>> do you really use the table name in ...where PROFILE.name=$1")  ??
>>
>>
>> jakob
>>
>> Kurt Hoehn wrote:
>>
>>  
>>
>>> Hello,
>>>
>>> I'm new to the group and the ojb stuff, but I noticed that only the
>>> ObjectReferenceDescriptor using the name of super will have a null 
>>> for the
>>> name of the persistent field. This is what I did to get it to work, 
>>> its not
>>> pretty and I don't know if I'm going down the right path but I used the
>>> extends in the class descriptor and used the refrence-descriptor of 
>>> super
>>>   
>>
>> to
>>  
>>
>>> get a 1:1 relationship.
>>>
>>>           OQLQuery query = odmg.newOQLQuery();
>>>           query.create( "select all from " + Branch.class.getName() + "
>>> where PROFILE.name=$1");
>>>           query.bind("Army");
>>>
>>> <class-descriptor class="com.etranscor.ojb.terminal.Profile"
>>> table="PROFILE">
>>>       <field-descriptor name="profileId"
>>>                         column="PROFILE_ID"
>>>                         jdbc-type="INTEGER"
>>>                         primarykey="true"
>>>                         nullable="false"
>>>                         autoincrement="true"
>>>                         sequence-name="TERMINAL_GENERATOR"/>
>>>       <field-descriptor name="name"
>>>                         column="NAME"
>>>                         jdbc-type="VARCHAR"
>>>                         nullable="false"
>>>                         length="200"/>
>>>       <field-descriptor name="status"
>>>                         column="STATUS"
>>>                         jdbc-type="CHAR"
>>>                         nullable="false"
>>>                         length="1"/>
>>>       <field-descriptor name="lastUpdateTime"
>>>                         column="LAST_UPDATE_TIME"
>>>                         jdbc-type="TIMESTAMP"
>>>                         nullable="false"/>
>>>   </class-descriptor>
>>> <!-- Definitions for com.etranscor.ojb.terminal.military.Branch -->
>>>   <class-descriptor class="com.etranscor.ojb.terminal.military.Branch"
>>>                     table="BRANCH"
>>>                     extends="com.etranscor.ojb.terminal.Profile">
>>>       <field-descriptor name="profileId"
>>>                         column="PROFILE_ID"
>>>                         jdbc-type="INTEGER"
>>>                         primarykey="true"
>>>                         nullable="false"
>>>                         autoincrement="true"
>>>                         sequence-name="TERMINAL_GENERATOR"/>
>>>       <field-descriptor name="code"
>>>                         column="CODE"
>>>                         jdbc-type="CHAR"
>>>                         length="2"
>>>                         nullable="false"/>
>>>
>>>       <reference-descriptor name="super"
>>> class-ref="com.etranscor.ojb.terminal.Profile">
>>>           <foreignkey field-ref="profileId"/>
>>>       </reference-descriptor>
>>>       <collection-descriptor name="regions"
>>>
>>> element-class-ref="com.etranscor.ojb.terminal.military.Region"
>>>                              refresh="true"
>>>                              proxy="true"
>>>                              auto-retrieve="true">
>>>           <inverse-foreignkey field-ref="branchId"/>
>>>       </collection-descriptor>
>>>   </class-descriptor>
>>>
>>>
>>> Here are the methods in the SqlSelectStatement.java
>>>
>>>   private void appendSuperClassJoin(ClassDescriptor cld, 
>>> ClassDescriptor
>>> cldSuper, StringBuffer stmt, StringBuffer where)
>>>   {
>>>       stmt.append(",").append(cldSuper.getFullTableName());
>>>       if(where != null && where.length() > 0){
>>>           where.append(" AND ");
>>>       }
>>>
>>>       // get reference field in super class
>>>       Iterator objRefs = 
>>> cld.getObjectReferenceDescriptors().iterator();
>>>       while( objRefs.hasNext() )
>>>       {
>>>           ObjectReferenceDescriptor superRef =
>>>   
>>
>> (ObjectReferenceDescriptor)
>>  
>>
>>> objRefs.next();
>>>           if( superRef.getPersistentField().getName() == null )
>>>           {
>>>               Iterator itr = superRef.getForeignKeyFields().iterator();
>>>               while( itr.hasNext() )
>>>               {
>>>                   FieldDescriptor field = cld.getFieldDescriptorByName(
>>> (String) itr.next() );
>>>
>>> where.append(cldSuper.getFullTableName()).append(".").append(
>>> cldSuper.getPrimaryKey().getColumnName() );
>>>                   where.append(" = ");
>>>
>>>   
>>
>> where.append(cld.getFullTableName()).append(".").append(
>>  
>>
>>> field.getColumnName() );
>>>
>>>                   if( itr.hasNext() )
>>>                   {
>>>                       where.append(" AND ");
>>>                   }
>>>               }
>>>
>>>               break;
>>>           }
>>>       }
>>>   }
>>>
>>>   private void appendSuperClassColumns(ClassDescriptor cldSub,
>>> ClassDescriptor cldSuper, StringBuffer buf)
>>>   {
>>>       FieldDescriptor[] fields = cldSuper.getFieldDescriptions();
>>>       for (int i = 0; i < fields.length; i++)
>>>       {
>>>           FieldDescriptor field = fields[i];
>>>
>>>           //Bad            if (i >= 0)
>>>               {
>>>                   buf.append(",");
>>>               }
>>>               buf.append(cldSuper.getFullTableName());
>>>               buf.append(".");
>>>               buf.append(field.getColumnName());
>>>               //columnList.add(field.getAttributeName());
>>>
>>>       }
>>>
>>>   }
>>>
>>> This works but I noticed that aliasing could be come an issue, and 
>>> are they
>>> going to be deprecating extends in the class-descriptor, sorry about 
>>> all
>>>   
>>
>> the
>>  
>>
>>> code.
>>>
>>> -kurt
>>>
>>>
>>> -----Original Message-----
>>> From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] Sent: Friday, August 
>>> 15, 2003 2:28 PM
>>> To: OJB Developers List
>>> Cc: houari.tine@ca-cedicam.fr
>>> Subject: [anonymous fields] querying fields of "Multiple Joined Tables"
>>> hi all,
>>>
>>> armin found a problem in the testcase which uses attributes of the 
>>> super class in a query.
>>> the situation is as follows:
>>>
>>> <class-descriptor
>>>       class="org.apache.ojb.broker.ObjectRepository$E"
>>>       table="TABLE_E">
>>> ...
>>>       <field-descriptor
>>>           name="someSuperValue"
>>>           column="SOMESUPERVALUE"
>>>           jdbc-type="INTEGER"
>>>       />
>>>
>>> </class-descriptor>
>>>
>>> <class-descriptor
>>>       class="org.apache.ojb.broker.ObjectRepository$F"
>>>       table="TABLE_F">
>>> ...
>>>       <field-descriptor
>>>           name="eID"
>>>           column="E_ID"
>>>           jdbc-type="INTEGER"
>>>           access="anonymous"
>>>       />
>>>
>>>       <field-descriptor
>>>           name="someValue"
>>>           column="SOMEVALUE"
>>>           jdbc-type="INTEGER"
>>>       />
>>>
>>>         <reference-descriptor name="super"
>>>             class-ref="org.apache.ojb.broker.ObjectRepository$E"
>>>           <foreignkey field-ref="eID" />
>>>         </reference-descriptor>
>>>   </class-descriptor>
>>>
>>>
>>> when querying for 'F' using attributes of 'F' (someValue) everything 
>>> is ok. but using attributes of the super E (someSuperValue) does not 
>>> work because there's no real relationship between 'F' and 'E'.
>>> i could solve the problem by adding the name 'super' to the 
>>> appropriate anonymous field:
>>>
>>>  public AnonymousPersistentFieldForInheritance(ClassDescriptor cld)
>>>  {
>>>      super("super");
>>>      this.cld = cld;
>>>  }
>>>
>>> in the query the attribute of class 'E' has to be prefixed by 'super':
>>>
>>>      c.addEqualTo("super.someSuperValue", new Integer(key2));
>>>
>>> this works, but we loose transparency :(
>>>
>>> what do you think ???
>>>
>>> jakob
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-dev-help@db.apache.org
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-dev-help@db.apache.org
>>>
>>>
>>>
>>>
>>>   
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-dev-help@db.apache.org
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-dev-help@db.apache.org
>>
>>
>>  
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>


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


Re: [anonymous fields] querying fields of "Multiple Joined Tables"

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

i just commited a patch which allows referencing attributes of the super 
class by prefixing them with 'super.'
see AnonymousFieldsTest#testQuerySuperField:
...
        Criteria c = new Criteria();
        c.addEqualTo("super.someSuperValue", new Integer(key2));
        Query q = QueryFactory.newQuery(ObjectRepository.F.class, c);
        Collection result = broker.getCollectionByQuery(q);
...

i will check kurt's solution as soon as time permits. this feature is 
also not yet documented !

jakob


Kurt Hoehn wrote:

>I did but this could cause an alias problem so its not good but I have a way
>now of getting to the super class then I can check to see if the property of
>"name" exists then alias the super classes table name so I wont need to
>alias the table name in the query.  This is not a production statement more
>of a proof of concept that I'm doing, checking to see if ojb is a good fit
>in our environment.
>
>-kurt
>
>
>-----Original Message-----
>From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] 
>Sent: Friday, August 15, 2003 3:42 PM
>To: OJB Developers List
>Subject: Re: [anonymous fields] querying fields of "Multiple Joined Tables"
>
>hi kurt,
>
>do you really use the table name in ...where PROFILE.name=$1")  ??
>
>
>jakob
>
>Kurt Hoehn wrote:
>
>  
>
>>Hello,
>>
>>I'm new to the group and the ojb stuff, but I noticed that only the
>>ObjectReferenceDescriptor using the name of super will have a null for the
>>name of the persistent field. This is what I did to get it to work, its not
>>pretty and I don't know if I'm going down the right path but I used the
>>extends in the class descriptor and used the refrence-descriptor of super
>>    
>>
>to
>  
>
>>get a 1:1 relationship.
>>
>>           OQLQuery query = odmg.newOQLQuery();
>>           query.create( "select all from " + Branch.class.getName() + "
>>where PROFILE.name=$1");
>>           query.bind("Army");
>>
>><class-descriptor class="com.etranscor.ojb.terminal.Profile"
>>table="PROFILE">
>>       <field-descriptor name="profileId"
>>                         column="PROFILE_ID"
>>                         jdbc-type="INTEGER"
>>                         primarykey="true"
>>                         nullable="false"
>>                         autoincrement="true"
>>                         sequence-name="TERMINAL_GENERATOR"/>
>>       <field-descriptor name="name"
>>                         column="NAME"
>>                         jdbc-type="VARCHAR"
>>                         nullable="false"
>>                         length="200"/>
>>       <field-descriptor name="status"
>>                         column="STATUS"
>>                         jdbc-type="CHAR"
>>                         nullable="false"
>>                         length="1"/>
>>       <field-descriptor name="lastUpdateTime"
>>                         column="LAST_UPDATE_TIME"
>>                         jdbc-type="TIMESTAMP"
>>                         nullable="false"/>
>>   </class-descriptor>
>><!-- Definitions for com.etranscor.ojb.terminal.military.Branch -->
>>   <class-descriptor class="com.etranscor.ojb.terminal.military.Branch"
>>                     table="BRANCH"
>>                     extends="com.etranscor.ojb.terminal.Profile">
>>       <field-descriptor name="profileId"
>>                         column="PROFILE_ID"
>>                         jdbc-type="INTEGER"
>>                         primarykey="true"
>>                         nullable="false"
>>                         autoincrement="true"
>>                         sequence-name="TERMINAL_GENERATOR"/>
>>       <field-descriptor name="code"
>>                         column="CODE"
>>                         jdbc-type="CHAR"
>>                         length="2"
>>                         nullable="false"/>
>>
>>       <reference-descriptor name="super"
>>class-ref="com.etranscor.ojb.terminal.Profile">
>>           <foreignkey field-ref="profileId"/>
>>       </reference-descriptor>
>>       <collection-descriptor name="regions"
>>
>>element-class-ref="com.etranscor.ojb.terminal.military.Region"
>>                              refresh="true"
>>                              proxy="true"
>>                              auto-retrieve="true">
>>           <inverse-foreignkey field-ref="branchId"/>
>>       </collection-descriptor>
>>   </class-descriptor>
>>
>>
>>Here are the methods in the SqlSelectStatement.java
>>
>>   private void appendSuperClassJoin(ClassDescriptor cld, ClassDescriptor
>>cldSuper, StringBuffer stmt, StringBuffer where)
>>   {
>>       stmt.append(",").append(cldSuper.getFullTableName());
>>       if(where != null && where.length() > 0){
>>           where.append(" AND ");
>>       }
>>
>>       // get reference field in super class
>>       Iterator objRefs = cld.getObjectReferenceDescriptors().iterator();
>>       while( objRefs.hasNext() )
>>       {
>>           ObjectReferenceDescriptor superRef =
>>    
>>
>(ObjectReferenceDescriptor)
>  
>
>>objRefs.next();
>>           if( superRef.getPersistentField().getName() == null )
>>           {
>>               Iterator itr = superRef.getForeignKeyFields().iterator();
>>               while( itr.hasNext() )
>>               {
>>                   FieldDescriptor field = cld.getFieldDescriptorByName(
>>(String) itr.next() );
>>
>>where.append(cldSuper.getFullTableName()).append(".").append(
>>cldSuper.getPrimaryKey().getColumnName() );
>>                   where.append(" = ");
>>
>>    
>>
>where.append(cld.getFullTableName()).append(".").append(
>  
>
>>field.getColumnName() );
>>
>>                   if( itr.hasNext() )
>>                   {
>>                       where.append(" AND ");
>>                   }
>>               }
>>
>>	  	    break;
>>           }
>>       }
>>   }
>>
>>   private void appendSuperClassColumns(ClassDescriptor cldSub,
>>ClassDescriptor cldSuper, StringBuffer buf)
>>   {
>>       FieldDescriptor[] fields = cldSuper.getFieldDescriptions();
>>       for (int i = 0; i < fields.length; i++)
>>       {
>>           FieldDescriptor field = fields[i];
>>
>>		  //Bad 
>>            if (i >= 0)
>>               {
>>                   buf.append(",");
>>               }
>>               buf.append(cldSuper.getFullTableName());
>>               buf.append(".");
>>               buf.append(field.getColumnName());
>>               //columnList.add(field.getAttributeName());
>>
>>       }
>>
>>   }
>>
>>This works but I noticed that aliasing could be come an issue, and are they
>>going to be deprecating extends in the class-descriptor, sorry about all
>>    
>>
>the
>  
>
>>code.
>>
>>-kurt
>>
>>
>>-----Original Message-----
>>From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] 
>>Sent: Friday, August 15, 2003 2:28 PM
>>To: OJB Developers List
>>Cc: houari.tine@ca-cedicam.fr
>>Subject: [anonymous fields] querying fields of "Multiple Joined Tables" 
>>
>>hi all,
>>
>>armin found a problem in the testcase which uses attributes of the super 
>>class in a query.
>>the situation is as follows:
>>
>><class-descriptor
>>       class="org.apache.ojb.broker.ObjectRepository$E"
>>       table="TABLE_E">
>>...
>>       <field-descriptor
>>           name="someSuperValue"
>>           column="SOMESUPERVALUE"
>>           jdbc-type="INTEGER"
>>       />
>>
>></class-descriptor>
>>
>><class-descriptor
>>       class="org.apache.ojb.broker.ObjectRepository$F"
>>       table="TABLE_F">
>>...
>>       <field-descriptor
>>           name="eID"
>>           column="E_ID"
>>           jdbc-type="INTEGER"
>>           access="anonymous"
>>       />
>>
>>       <field-descriptor
>>           name="someValue"
>>           column="SOMEVALUE"
>>           jdbc-type="INTEGER"
>>       />
>>
>>         <reference-descriptor name="super"
>>             class-ref="org.apache.ojb.broker.ObjectRepository$E"
>>           <foreignkey field-ref="eID" />
>>         </reference-descriptor>
>>   </class-descriptor>
>>
>>
>>when querying for 'F' using attributes of 'F' (someValue) everything is 
>>ok. but using attributes of the super E (someSuperValue) does not work 
>>because there's no real relationship between 'F' and 'E'.
>>i could solve the problem by adding the name 'super' to the appropriate 
>>anonymous field:
>>
>>  public AnonymousPersistentFieldForInheritance(ClassDescriptor cld)
>>  {
>>      super("super");
>>      this.cld = cld;
>>  }
>>
>>in the query the attribute of class 'E' has to be prefixed by 'super':
>>
>>      c.addEqualTo("super.someSuperValue", new Integer(key2));
>>
>>this works, but we loose transparency :(
>>
>>what do you think ???
>>
>>jakob
>>
>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>>For additional commands, e-mail: ojb-dev-help@db.apache.org
>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>>For additional commands, e-mail: ojb-dev-help@db.apache.org
>>
>>
>> 
>>
>>    
>>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
>  
>


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


RE: [anonymous fields] querying fields of "Multiple Joined Tables"

Posted by Kurt Hoehn <kh...@etranscor.com>.
I did but this could cause an alias problem so its not good but I have a way
now of getting to the super class then I can check to see if the property of
"name" exists then alias the super classes table name so I wont need to
alias the table name in the query.  This is not a production statement more
of a proof of concept that I'm doing, checking to see if ojb is a good fit
in our environment.

-kurt


-----Original Message-----
From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] 
Sent: Friday, August 15, 2003 3:42 PM
To: OJB Developers List
Subject: Re: [anonymous fields] querying fields of "Multiple Joined Tables"

hi kurt,

do you really use the table name in ...where PROFILE.name=$1")  ??


jakob

Kurt Hoehn wrote:

>Hello,
>
>I'm new to the group and the ojb stuff, but I noticed that only the
>ObjectReferenceDescriptor using the name of super will have a null for the
>name of the persistent field. This is what I did to get it to work, its not
>pretty and I don't know if I'm going down the right path but I used the
>extends in the class descriptor and used the refrence-descriptor of super
to
>get a 1:1 relationship.
>
>            OQLQuery query = odmg.newOQLQuery();
>            query.create( "select all from " + Branch.class.getName() + "
>where PROFILE.name=$1");
>            query.bind("Army");
>
><class-descriptor class="com.etranscor.ojb.terminal.Profile"
>table="PROFILE">
>        <field-descriptor name="profileId"
>                          column="PROFILE_ID"
>                          jdbc-type="INTEGER"
>                          primarykey="true"
>                          nullable="false"
>                          autoincrement="true"
>                          sequence-name="TERMINAL_GENERATOR"/>
>        <field-descriptor name="name"
>                          column="NAME"
>                          jdbc-type="VARCHAR"
>                          nullable="false"
>                          length="200"/>
>        <field-descriptor name="status"
>                          column="STATUS"
>                          jdbc-type="CHAR"
>                          nullable="false"
>                          length="1"/>
>        <field-descriptor name="lastUpdateTime"
>                          column="LAST_UPDATE_TIME"
>                          jdbc-type="TIMESTAMP"
>                          nullable="false"/>
>    </class-descriptor>
><!-- Definitions for com.etranscor.ojb.terminal.military.Branch -->
>    <class-descriptor class="com.etranscor.ojb.terminal.military.Branch"
>                      table="BRANCH"
>                      extends="com.etranscor.ojb.terminal.Profile">
>        <field-descriptor name="profileId"
>                          column="PROFILE_ID"
>                          jdbc-type="INTEGER"
>                          primarykey="true"
>                          nullable="false"
>                          autoincrement="true"
>                          sequence-name="TERMINAL_GENERATOR"/>
>        <field-descriptor name="code"
>                          column="CODE"
>                          jdbc-type="CHAR"
>                          length="2"
>                          nullable="false"/>
>
>        <reference-descriptor name="super"
>class-ref="com.etranscor.ojb.terminal.Profile">
>            <foreignkey field-ref="profileId"/>
>        </reference-descriptor>
>        <collection-descriptor name="regions"
> 
>element-class-ref="com.etranscor.ojb.terminal.military.Region"
>                               refresh="true"
>                               proxy="true"
>                               auto-retrieve="true">
>            <inverse-foreignkey field-ref="branchId"/>
>        </collection-descriptor>
>    </class-descriptor>
>
>
>Here are the methods in the SqlSelectStatement.java
>
>    private void appendSuperClassJoin(ClassDescriptor cld, ClassDescriptor
>cldSuper, StringBuffer stmt, StringBuffer where)
>    {
>        stmt.append(",").append(cldSuper.getFullTableName());
>        if(where != null && where.length() > 0){
>            where.append(" AND ");
>        }
>
>        // get reference field in super class
>        Iterator objRefs = cld.getObjectReferenceDescriptors().iterator();
>        while( objRefs.hasNext() )
>        {
>            ObjectReferenceDescriptor superRef =
(ObjectReferenceDescriptor)
>objRefs.next();
>            if( superRef.getPersistentField().getName() == null )
>            {
>                Iterator itr = superRef.getForeignKeyFields().iterator();
>                while( itr.hasNext() )
>                {
>                    FieldDescriptor field = cld.getFieldDescriptorByName(
>(String) itr.next() );
> 
>where.append(cldSuper.getFullTableName()).append(".").append(
>cldSuper.getPrimaryKey().getColumnName() );
>                    where.append(" = ");
>
where.append(cld.getFullTableName()).append(".").append(
>field.getColumnName() );
>
>                    if( itr.hasNext() )
>                    {
>                        where.append(" AND ");
>                    }
>                }
>
>	  	    break;
>            }
>        }
>    }
>
>    private void appendSuperClassColumns(ClassDescriptor cldSub,
>ClassDescriptor cldSuper, StringBuffer buf)
>    {
>        FieldDescriptor[] fields = cldSuper.getFieldDescriptions();
>        for (int i = 0; i < fields.length; i++)
>        {
>            FieldDescriptor field = fields[i];
>
>		  //Bad 
>             if (i >= 0)
>                {
>                    buf.append(",");
>                }
>                buf.append(cldSuper.getFullTableName());
>                buf.append(".");
>                buf.append(field.getColumnName());
>                //columnList.add(field.getAttributeName());
>
>        }
>
>    }
>
>This works but I noticed that aliasing could be come an issue, and are they
>going to be deprecating extends in the class-descriptor, sorry about all
the
>code.
>
>-kurt
>
>
>-----Original Message-----
>From: Jakob Braeuchi [mailto:jbraeuchi@gmx.ch] 
>Sent: Friday, August 15, 2003 2:28 PM
>To: OJB Developers List
>Cc: houari.tine@ca-cedicam.fr
>Subject: [anonymous fields] querying fields of "Multiple Joined Tables" 
>
>hi all,
>
>armin found a problem in the testcase which uses attributes of the super 
>class in a query.
>the situation is as follows:
>
> <class-descriptor
>        class="org.apache.ojb.broker.ObjectRepository$E"
>        table="TABLE_E">
> ...
>        <field-descriptor
>            name="someSuperValue"
>            column="SOMESUPERVALUE"
>            jdbc-type="INTEGER"
>        />
>
> </class-descriptor>
>
> <class-descriptor
>        class="org.apache.ojb.broker.ObjectRepository$F"
>        table="TABLE_F">
>...
>        <field-descriptor
>            name="eID"
>            column="E_ID"
>            jdbc-type="INTEGER"
>            access="anonymous"
>        />
>
>        <field-descriptor
>            name="someValue"
>            column="SOMEVALUE"
>            jdbc-type="INTEGER"
>        />
>
>          <reference-descriptor name="super"
>              class-ref="org.apache.ojb.broker.ObjectRepository$E"
>            <foreignkey field-ref="eID" />
>          </reference-descriptor>
>    </class-descriptor>
>
>
>when querying for 'F' using attributes of 'F' (someValue) everything is 
>ok. but using attributes of the super E (someSuperValue) does not work 
>because there's no real relationship between 'F' and 'E'.
>i could solve the problem by adding the name 'super' to the appropriate 
>anonymous field:
>
>   public AnonymousPersistentFieldForInheritance(ClassDescriptor cld)
>   {
>       super("super");
>       this.cld = cld;
>   }
>
>in the query the attribute of class 'E' has to be prefixed by 'super':
>
>       c.addEqualTo("super.someSuperValue", new Integer(key2));
>
>this works, but we loose transparency :(
>
>what do you think ???
>
>jakob
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
>For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
>  
>


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



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