Hi Rudi,
I had to address a similar problem as part of implementing a "query by object"
mechanism (tricky!) to search on "partially complete" objects rather than using
straight queries themselves.. The basic idea I had was as follows:
- build an empty A and set your concrete B into its collection (use this as a
basis for what follows);
- use the CollectionDescriptor of class A to get the FK column names of the
indirection table to both the item class (B) and the "this" class (A), and also
the name of the indirection table itself;
- then, from your concrete B, use its ClassDescriptor to get the PK field info
and hence from that a PersistentField from which you can obtain the actual PK
value of your B object;
- then build a Criteria object with the following:
1) an "addEqualToColumn" which matches the PK field for A to its
corresponding column name in the indirection table, plus
2) an "addEqualTo" which matches the actual PK value you have for B with its
corresponding column name in the indirection table;
- then finally create a "QueryByMtoNCriteria" with the class of A, the
indirection table name and the newly built Criteria object.
>From there you can do a getCollectionByQuery with your newly built Query object
above. I'm sure there are easier ways but that was the easiest I could come up
with for now and it works OK for me.
Hope that helps,
Cheers,
Chris
Rudi Alberda wrote:
> Hi all,
>
> I have a question regarding queries on m:n relations. Suppose I have two
> classes which are associated in OJB through a m:n relation, objects of type
> 'A' and 'B'. 'A' has a property called 'bees' returning all objects of type
> 'B', 'B' has a property called 'as' which returns all 'A' objects.
> This all works nicely in OJB, storing, updating, deleting. But now I want to
> query. I have an object of type 'B' and I want to know which objects of type
> 'A' are associated to it. In other words, I'd like a query which results in
> a collection of 'A' objects for which 'B' is in the collection 'A.bees'.
> How would this work?
> I cannot simply go and create a query like:
>
> Criteria c = new Criteria();
> c.addEqualTo("bees", B);
> Query q = new QueryByCriteria(B.class, c, false);
> broker.getCollectionByQuery(q);
>
> because bees is a collection. Will Criteria.addIn work? And if this doesn't,
> what will?
> I have looked at QueryByMtoNCriteria but the documentation of this was
> rather unclear.
> Also, I might be able to use Criteria.addExists, but I need to refer to a
> field from the main query in the subquery, otherwise my subQuery isn't of
> much use.
> Help!
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>