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: [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