hi,

you'll have to define the relationship to D in the abstract S as well as in the concrete B and C. it has to be defined in S because when navigation from A the descriptor of class S is used to resolve the relationship.

i tried this meaningless query :

Criteria crit = new Criteria();
crit.addLike("allArticlesInGroup.productGroup.groupName", "B%");
QueryByCriteria q = ueryFactory.newQuery(ProductGroupWithAbstractArticles.class, crit, true);


if i do not define a relationship in class InterfaceArticle to class ProductGroup the SQL fails. after adding <reference-descriptor name="productGroup" it worked.

...
   <class-descriptor class="org.apache.ojb.broker.InterfaceArticle">
      <extent-class class-ref="org.apache.ojb.broker.Article" />
      <extent-class class-ref="org.apache.ojb.broker.BookArticle" />
      <extent-class class-ref="org.apache.ojb.broker.CdArticle" />

<reference-descriptor
name="productGroup"
class-ref="org.apache.ojb.broker.ProductGroup"
>
<documentation>this is the reference to an articles productgroup</documentation>
<foreignkey field-ref="productGroupId"/>
<attribute attribute-name="color" attribute-value="red" />
<attribute attribute-name="size" attribute-value="tiny" />
</reference-descriptor>


   </class-descriptor>
...

hth
jakob

Jakob Braeuchi wrote:

hi charles, steve,

i do not think that my fix is related to this problem. i propose to move the definition of the relationship to the concrete classes.

jakob

Charles Anthony wrote:

Hi,

I have a hunch - quite possibly misplaced - that this may have something to
do the bug I reported in the thhread entitled.
"Criteria.setClassPath - the saga continues"


Although you are using an ODMG query, when the query is parsed, it does
generate a standard QueryByCriteria. QueryByCriteria was getting the wrong
class descriptor when paths of > 1 sement were used. This would lead to the
attribute name being passed to the query, as opposed to the column name.


Jakob fixed this in CVS last night.

This May Be A Red Herring.

Cheers,

Charles.


-----Original Message-----
From: Steve Clark [mailto:[EMAIL PROTECTED]
Sent: 03 March 2004 19:56
To: OJB Users List
Subject: Re: Extent problem with ODMG


I'm still having this problem, so I'm going to try again.


Using ODMG, RC5, Oracle 9i.

Summary:
   - Class A has a 1-to-1 relationship 'abs' to an abstract
     superclass S
   - Class S has concrete subclasses B and C
   - Classes B and C share a common relationship 'com' to another
     class D; this relationship is defined in the superclass S
   - Class D has a property 'p'
   - A, B, C, and D map to distinct tables

I am trying to retrieve all A's which have a given value for 'p' in
the D associated with the related B or C (whichever one it is).  So:

select x from A where A.abs.com.p = ?

A.abs has type S, the abstract superclass; A.abs.com has type D.  This
means that the query needs to generate some sort of interesting join
to check for both possible paths to D (via B or C), knowing that
either B or C will have exactly one row satisfying the join
condition(s).  In pseudocode:

   select x from A where
       if A.abs instanceof B then ((B) A.abs).com.p = ?
       else if A.abs instanceof C then ((C) A.abs).com.p = ?

Should I expect this to work?  The SQL query which is being generated
is not only incorrect but invalid: OJB does not rewrite 'p', and in
fact does not even mention D at all.  I assume this has to do with
the fact that the repository doesn't record the presence of the
relationship 'com' in the abstract superclass, but only in the
subclasses.  Queries starting from B or C and following the 'com'
relationship work fine.  Am I out of luck, or is there some way I can
get a working query out of this?

thanks for any insights,
Steve Clark
Technology Applications Team
Natural Resources Research Center/USGS
[EMAIL PROTECTED]
(970)226-9291

PS: Original message below. Name mappings:

A = PartnerImpl
B = SubSiteImpl
C = TechAssistImpl
D = SiteImpl
S = AccomplishmentImpl

abs = accomp
com = site
p = habTypeCode

   sc> I'm having a problem with extents in ODMG.  OJB is generating
   sc> incorrect (and, in fact, invalid) SQL for my OQL query.  I'm
   sc> using RC5.

   sc> My data model consists of Sites, which have collections of
   sc> each of two kinds of Accomplishments (SubSites and
   sc> TechAssists).  An Accomplishment has a collection of Partners.
   sc> In the reverse direction, each Partner is associated with
   sc> exactly one Accomplishment (either a SubSite or a TechAssist),
   sc> and an Accomplishment knows about its parent Site.  My
   sc> repository looks like this:

sc> <!-- - - - - - - Site - - - - - - -->

   sc> <class-descriptor
   sc>     class="gov.doi.habits.dataobjects.SiteImpl"
   sc>     table="SITE_DETAIL" proxy="dynamic">

   sc>   <field-descriptor
   sc>       name="siteKey" column="SITE_KEY" jdbc-type="INTEGER"
   sc>       primarykey="true" autoincrement="true"/>

   sc>   <field-descriptor
   sc>       name="habTypeCode" column="HAB_TYPE_CODE"
   sc>       jdbc-type="INTEGER" />

sc> <collection-descriptor
sc> name="subSites"
sc> element-class-ref="gov.doi.habits.dataobjects.SubSiteImpl"
sc> collection-class="org.apache.ojb.broker.util.collections.Manag
eableArrayList">
sc> <inverse-foreignkey field-ref="siteKey" />
sc> </collection-descriptor>


sc> <collection-descriptor
sc> name="techAssists"
sc> element-class-ref="gov.doi.habits.dataobjects.TechAssistImpl"
sc> collection-class="org.apache.ojb.broker.util.collections.Manag
eableArrayList">
sc> <inverse-foreignkey field-ref="siteKey" />
sc> </collection-descriptor>
sc> </class-descriptor>


sc> <!-- - - - - - - Accomplishment - - - - - - -->

   sc> <class-descriptor
   sc> class="gov.doi.habits.dataobjects.AccomplishmentImpl" >

   sc>   <extent-class
   sc>   class-ref="gov.doi.habits.dataobjects.SubSiteImpl" />
   sc>   <extent-class
   sc>   class-ref="gov.doi.habits.dataobjects.AssistImpl" />
   sc> </class-descriptor>

sc> <!-- - - - - - - SubSite - - - - - - -->

   sc> <class-descriptor
   sc>     class="gov.doi.habits.dataobjects.SubSiteImpl"
   sc>     table="SUB_SITE_DETAIL" proxy="dynamic">

   sc>   <field-descriptor
   sc>       name="accompKey" column="ACCOMP_KEY" jdbc-type="INTEGER"
   sc>       primarykey="true" autoincrement="true"
   sc>       sequence-name="SEQ_ACCOMP_DETAIL" />

   sc>   <field-descriptor
   sc>       name="siteKey" column="SITE_KEY" jdbc-type="INTEGER" />

   sc>   <reference-descriptor
   sc>       name="site"
   sc>       class-ref="gov.doi.habits.dataobjects.SiteImpl">
   sc>       <foreignkey field-ref="siteKey" />
   sc>   </reference-descriptor>

sc> <collection-descriptor
sc> name="partners"
sc> element-class-ref="gov.doi.habits.dataobjects.PartnerImpl"
sc> collection-class="org.apache.ojb.broker.util.collections.Manag
eableArrayList">
sc> <inverse-foreignkey field-ref="accompKey" />
sc> </collection-descriptor>
sc> </class-descriptor>


sc> <!-- - - - - - - TechAssist - - - - - - -->

   sc> <class-descriptor
   sc>     class="gov.doi.habits.dataobjects.TechAssistImpl"
   sc>     table="ASSIST_DETAIL" proxy="dynamic">

   sc>   <field-descriptor
   sc>       name="accompKey" column="ACCOMP_KEY" jdbc-type="INTEGER"
   sc>       primarykey="true" autoincrement="true"
   sc>       sequence-name="SEQ_ACCOMP_DETAIL" />

   sc>   <field-descriptor
   sc>       name="siteKey" column="SITE_KEY" jdbc-type="INTEGER" />

   sc>   <reference-descriptor
   sc>       name="site"
   sc>       class-ref="gov.doi.habits.dataobjects.SiteImpl">
   sc>       <foreignkey field-ref="siteKey" />
   sc>   </reference-descriptor>

sc> <collection-descriptor
sc> name="partners"
sc> element-class-ref="gov.doi.habits.dataobjects.PartnerImpl"
sc> collection-class="org.apache.ojb.broker.util.collections.Manag
eableArrayList">
sc> <inverse-foreignkey field-ref="accompKey" />
sc> </collection-descriptor>
sc> </class-descriptor>


sc> <!-- - - - - - - Partner - - - - - - -->

   sc> <class-descriptor
   sc>     class="gov.doi.habits.dataobjects.PartnerImpl"
   sc>     table="PARTNER_DETAIL" proxy="dynamic">

   sc>   <field-descriptor
   sc>       name="partnerKey" column="PARTNER_KEY"
   sc>       jdbc-type="INTEGER" primarykey="true"
   sc>       autoincrement="true"/>

   sc>   <field-descriptor
   sc>       name="accompKey" column="ACCOMP_KEY"
   sc>       jdbc-type="INTEGER"/>

   sc>   <reference-descriptor
   sc>       name="accomp"
   sc>       class-ref="gov.doi.habits.dataobjects.AccomplishmentImpl">
   sc>     <foreignkey field-ref="accompKey"/>
   sc>   </reference-descriptor>
   sc> </class-descriptor>

sc> My query looks like this:

   sc>   15:41:13,896 DEBUG [] accesslayer.JdbcAccessImpl
   sc>   (JdbcAccessImpl.java:282) - executeQuery : Query from class
   sc>   gov.doi.habits.dataobjects.PartnerImpl where
   sc>   [accomp.site.habTypeCode IN [1]]

   sc> Note that partner.accomp is an Accomplishment (the abstract
   sc> superclass); both extents (SubSite and TechAssist) have a site
   sc> relationship.

sc> The generated SQL looks like this:

sc> 15:41:13,901 DEBUG [] sql.SqlGeneratorDefaultImpl
sc> (SqlGeneratorDefaultImpl.java:200) - SQL:SELECT DISTINCT
sc> A0.ACCOMP_KEY,A0.PARTNER_KEY FROM PARTNER_DETAIL
sc> A0,SUB_SITE_DETAIL A1,ASSIST_DETAIL A1E1 WHERE
sc> A0.ACCOMP_KEY=A1.ACCOMP_KEY(+) AND
sc> A0.ACCOMP_KEY=A1E1.ACCOMP_KEY(+) AND ((habTypeCode IN ( ? ) sc> OR habTypeCode IN ( ? )))


   sc> Note that SITE_DETAIL is not even included in the query, and
   sc> habTypeCode as a result is not rewritten to the appropriate
   sc> column name.

sc> I think the correct query would be more like this:

   sc>   SELECT DISTINCT A0.ACCOMP_KEY,A0.PARTNER_KEY
   sc>     FROM PARTNER_DETAIL A0,SUB_SITE_DETAIL A1,ASSIST_DETAIL
   sc>     A1E1,SITE_DETAIL A2 WHERE ((A0.ACCOMP_KEY=A1.ACCOMP_KEY(+)
   sc>     AND A1.SITE_KEY=A2.SITE_KEY) OR
   sc>            (A0.ACCOMP_KEY=A1E1.ACCOMP_KEY(+) AND
   sc>            A1E1.SITE_KEY=A2.SITE_KEY)) AND
   sc>           (A2.HAB_TYPE_CODE IN ( ? ))

sc> ... though I'm not sure that's exactly right even.

sc> Is there a way to get working SQL out of this OQL?

   sc> thanks, -- Steve Clark Technology Applications Team Natural
   sc> Resources Research Center/USGS [EMAIL PROTECTED]
   sc> (970)226-9291

sc> ---------------------------------------------------------------------
sc> To unsubscribe, e-mail: [EMAIL PROTECTED] For
sc> additional commands, e-mail: [EMAIL PROTECTED]


   sc> --
Steve Clark
Technology Applications Team
Natural Resources Research Center/USGS
[EMAIL PROTECTED]
(970)226-9291

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





___________________________________________________________ HPD Software Ltd. - Helping Business Finance Business Email terms and conditions: www.hpdsoftware.com/disclaimer


--------------------------------------------------------------------- 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]



--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to