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