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 Kohlweiss Georg <Ge...@oekb.at> on 2004/09/16 17:12:20 UTC
user aliases for more then one attribute path segment
Hi!
First of all I want to mention that OJB does a lot of work for me and is a great project!
Many problems i had with user aliases i solved for my own, but now i can't find a way out :(
Here's my problem:
I have 2 Object-Classes
ItemImpl and PropertyImpl (one item has many named properties, ItemImpl 1--M PropertyImpl)
Here is my classdescr:
<class-descriptor
class="ItemImpl"
table="ITEMS"
>
<field-descriptor id="1"
name="id"
column="ID"
jdbc-type="BIGINT"
nullable="false"
primarykey="true"
autoincrement="true"
sequence-name="IT_SEQ"
/>
<collection-descriptor
name="allProperties"
element-class-ref="PropertyImpl"
orderby="id"
sort="ASC"
proxy="true"
>
<inverse-foreignkey field-id-ref="4"/>
</collection-descriptor>
<collection-descriptor
name="allDetailItemProperties"
element-class-ref="PropertyImpl"
orderby="id"
sort="ASC"
proxy="true"
>
<inverse-foreignkey field-id-ref="5"/>
</collection-descriptor>
</class-descriptor>
<class-descriptor
class="PropertyImpl"
table="PROPERTIES"
>
<field-descriptor id="1"
name="id"
column="ID"
jdbc-type="BIGINT"
nullable="false"
primarykey="true"
autoincrement="true"
sequence-name="P_SEQ"
/>
<field-descriptor id="4"
name="itemId"
column="IT_ID"
jdbc-type="BIGINT"
nullable="false"
/>
<field-descriptor id="5"
name="itemIdReferenced"
column="IT_ID_REF"
jdbc-type="BIGINT"
nullable="false"
/>
<field-descriptor id="6"
name="name"
column="NAME"
jdbc-type="VARCHAR"
nullable="false"
length="4000"
/>
<field-descriptor id="7"
name="value"
column="VALUE"
jdbc-type="VARCHAR"
nullable="false"
length="4000"
/>
<reference-descriptor name="item"
class-ref="ItemImpl"
proxy="true">
<foreignkey field-id-ref="4"/>
</reference-descriptor>
<reference-descriptor name="itemReferenced"
class-ref="ItemImpl"
proxy="true">
<foreignkey field-id-ref="5"/>
</reference-descriptor>
</class-descriptor>
Of course PropertyImpl has one reference to its corresponding ItemImpl object, but PropertyImpl has another reference to ItemImpl because
a property of an item can point to another parent item, e.g. a persons property named myHome points to a separate home item.
Now I want to query all home items (maybe distinct), which where referenced from a person item matching some property-criterias.
I defined a Criteria-Tree like this:
#############################
Criteria rootCrit = new Criteria();
rootCrit.addEqualTo("allDetailItemProperties.name", "myHome");
Criteria propCrit1 = new Criteria();
propCrit1.setAlias("prop1", "allProperties");
propCrit1.addEqualTo("allDetailItemProperties.item.allProperties.name", "firstName");
propCrit1.addEqualTo("allDetailItemProperties.item.allProperties.value", "Jack");
rootCrit.addAndCriteria(propCrit1);
Criteria propCrit2 = new Criteria();
propCrit2.setAlias("prop2", "allProperties");
propCrit2.addEqualTo("allDetailItemProperties.item.allProperties.name", "hairColor");
propCrit2.addEqualTo("allDetailItemProperties.item.allProperties.value", "black");
rootCrit.addAndCriteria(propCrit2);
Collection result = PersistenceBrokerFactory.defaultPersistenceBroker ().
getCollectionByQuery(new QueryByCriteria(ItemImpl.class, rootCrit));
#############################
This works fine, but if the selected homes have to satisfy another criteria of a detail item,
e.g. all homes that have a red chrysler car in their garage, additional aliases in the path segment "allDetailItemProperties"
have to be used.
I didn't got it working, i tried it that way:
#############################
Criteria rootCrit = new Criteria();
rootCrit.setAlias("detail1", "allDetailItemProperties");
rootCrit.addEqualTo("allDetailItemProperties.name", "myHome");
Criteria propCrit1 = new Criteria();
propCrit1.setAlias("prop1", "allProperties");
propCrit1.addEqualTo("allDetailItemProperties.item.allProperties.name", "firstName");
propCrit1.addEqualTo("allDetailItemProperties.item.allProperties.value", "Jack");
rootCrit.addAndCriteria(propCrit1);
Criteria propCrit2 = new Criteria();
propCrit2.setAlias("prop2", "allProperties");
propCrit2.addEqualTo("allDetailItemProperties.item.allProperties.name", "hairColor");
propCrit2.addEqualTo("allDetailItemProperties.item.allProperties.value", "black");
rootCrit.addAndCriteria(propCrit2);
Criteria rootCrit2 = new Criteria();
root2Crit.setAlias("detail2", "allDetailItemProperties");
root2Crit.addEqualTo("allDetailItemProperties.name", "carsHome");
Criteria propCrit3 = new Criteria();
propCrit3.setAlias("prop3", "allProperties");
propCrit3.addEqualTo("allDetailItemProperties.item.allProperties.name", "manufactory");
propCrit3.addEqualTo("allDetailItemProperties.item.allProperties.value", "chrysler");
rootCrit2.addAndCriteria(propCrit3);
Criteria propCrit4 = new Criteria();
propCrit4.setAlias("prop4", "allProperties");
propCrit4.addEqualTo("allDetailItemProperties.item.allProperties.name", "color");
propCrit4.addEqualTo("allDetailItemProperties.item.allProperties.value", "red");
rootCrit2.addAndCriteria(propCrit4);
rootCrit.addAndCriteria(rootCrit2);
Collection result = PersistenceBrokerFactory.defaultPersistenceBroker ().
getCollectionByQuery(new QueryByCriteria(ItemImpl.class, rootCrit));
#############################
When i apply the alias to the root-criteria it seems that the portions "allDetailItemProperties" of the attribute paths
of propCrit1..4 get their own ITEMS-table joined instead of using the alias of the parent Criteria (rootCrit)
Maybe there is a way to configure the aliases with use of the class UserAlias, I tried everything without success.
Please help!
thx in advance,
Georg
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org