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 CLARAMONTE Jean-Baptiste <jb...@aston.fr> on 2004/11/29 11:43:02 UTC
Deep retrieve : a proposal
I've noticed that OJB doesn't offer a deep retrieve reference service, so I
have developped an utility for retrieving from one reference all the deep
references (and back references).
Example :
we have the following model :
[A]<(*)listeA-----(1)b>[B]<(1)b-----(*)listeC>[C]-----(1)d>[D]
/\
(*)listeB
||
(*)listeE
\/
[E]
Supposing we already have retrieved a reference on [A] and now we would like
to retrieve all the references associated from this instance. Using the
DeepRerieve utility the following code will do the job for you :
Criteria crit = new Criteria();
crit.addEqualTo("idA", new Long(0));
QueryByCriteria query = QueryFactory.newQuery(A.class, crit);
A result = (A)broker.getObjectByQuery(query);
DeepRetrieve deepRetrieve = new DeepRetrieve(broker);
deepRetrieve.addRetrieveRef("b(listeA).listeC(b).d");
deepRetrieve.addRetrieveRef("b.listeE(listeB)");
deepRetrieve.retrieve(result);
Without the DeepRetrieve utility the following code should have been used :
Criteria crit = new Criteria();
crit.addEqualTo("idA", new Long(0));
QueryByCriteria query = QueryFactory.newQuery(A.class, crit);
query.addPrefetchedRelationship("b");
A result = (A)broker.getObjectByQuery(query);
broker.retrieveReference(result.getB(), "listeA");
broker.retrieveReference(result.getB(), "listeC");
Iterator iter = result.getB().getListeC().iterator();
while (iter.hasNext()) {
C c = (C)iter.next();
broker.retrieveReference(c, "d");
broker.retrieveReference(c, "b");
}
broker.retrieveReference(result.getB(), "listeE");
iter = result.getB().getListeE().iterator();
while (iter.hasNext()) {
E e = (E)iter.next();
broker.retrieveReference(e, "listeB");
}
>From my first tests this DeepRetrive leads to the same amount of sql query.
The code is easier to read. (well from my point of view...)
regards,
JB
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org
Re: Deep retrieve : a proposal
Posted by Jakob Braeuchi <jb...@gmx.ch>.
hi jean-baptiste,
ojb already offers auto-retrieve = true in the collection-descriptor to load
related objects automatically. an additional feature are the prefetched
relationships that allow you to load related object in a single query instead of
executing one query for each parent object.
what is the additional benefit of DeepRetrieve ?
jakob
CLARAMONTE Jean-Baptiste schrieb:
> I've noticed that OJB doesn't offer a deep retrieve reference service, so I
> have developped an utility for retrieving from one reference all the deep
> references (and back references).
> Example :
> we have the following model :
> [A]<(*)listeA-----(1)b>[B]<(1)b-----(*)listeC>[C]-----(1)d>[D]
> /\
> (*)listeB
> ||
> (*)listeE
> \/
> [E]
>
> Supposing we already have retrieved a reference on [A] and now we would like
> to retrieve all the references associated from this instance. Using the
> DeepRerieve utility the following code will do the job for you :
>
> Criteria crit = new Criteria();
> crit.addEqualTo("idA", new Long(0));
>
> QueryByCriteria query = QueryFactory.newQuery(A.class, crit);
>
> A result = (A)broker.getObjectByQuery(query);
>
> DeepRetrieve deepRetrieve = new DeepRetrieve(broker);
> deepRetrieve.addRetrieveRef("b(listeA).listeC(b).d");
> deepRetrieve.addRetrieveRef("b.listeE(listeB)");
> deepRetrieve.retrieve(result);
>
> Without the DeepRetrieve utility the following code should have been used :
>
> Criteria crit = new Criteria();
> crit.addEqualTo("idA", new Long(0));
>
> QueryByCriteria query = QueryFactory.newQuery(A.class, crit);
> query.addPrefetchedRelationship("b");
>
> A result = (A)broker.getObjectByQuery(query);
>
> broker.retrieveReference(result.getB(), "listeA");
> broker.retrieveReference(result.getB(), "listeC");
> Iterator iter = result.getB().getListeC().iterator();
> while (iter.hasNext()) {
> C c = (C)iter.next();
> broker.retrieveReference(c, "d");
> broker.retrieveReference(c, "b");
> }
>
> broker.retrieveReference(result.getB(), "listeE");
> iter = result.getB().getListeE().iterator();
> while (iter.hasNext()) {
> E e = (E)iter.next();
> broker.retrieveReference(e, "listeB");
> }
>
>
>>>From my first tests this DeepRetrive leads to the same amount of sql query.
> The code is easier to read. (well from my point of view...)
>
> regards,
>
> JB
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org