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]