Hello all,
I did some more research and discovered the following:
===========
(in PrefetchHelper.java resolveToOneRelations() )
List oids = new ArrayList(nobjects);
for (int i = 0; i < nobjects; i++) {
DataObject sourceObject = (DataObject) objects.get(i);
DataObject targetObject =
(DataObject) sourceObject.readPropertyDirectly(relName);
ObjectId oid = targetObject.getObjectId();
oids.add(oid);
}
===========
The "(DataObject) sourceObject.readPropertyDirectly(relName);" causes the
ClassCastException because the Object the readPropertyDirectly returns is
of type:
===========
class org.objectstyle.cayenne.Fault$ToOneFault -
org.objectstyle.cayenne.Fault$ToOneFaul..779885
===========
Because Fault isn't a subclass (or implements interface) of DataObject the
casting generates a "ClassCastException".
I'm currently using "cayenne-1.1B2".
Cheers,
Twan
At 10:07 25-8-2004, you wrote:
>Hello Tore,
>
>
>
>>>where.add(" (opleiding.the_geom && GeometryFromText('BOX3D(" +
>>
>>Nice to see someone else playing with postgis and cayenne :)
>
>What a coincidence, i thought i was one of the very few using postgis ;-)
>Your also using mapserver?
>
>
>>>Is it possible to prefetch relationships when using SQLTemplate?
>>
>>Take a look at PrefetchHelper
>>http://www.objectstyle.org/cayenne/api/cayenne/org/objectstyle/cayenne/
>>access/util/PrefetchHelper.html
>>
>>Try something like:
>>String query=".." //query with a lot of joins and non standard where
>>statements
>>SQLTemplate rawSelect = new SQLTemplate(Opleiding.class, query, true);
>>List opleidingen = ctxt.performQuery(rawSelect);
>>PrefetchHelper.resolveToOneRelations(ctxt, opleidingen,
>>"waardeopleiding");
>>
>>If I remember correctly this will result in a huge query looking like
>>"select .... from table where field in (....)". This trick take some
>>time if your opleidingen List is very long..
>
>Thanks for the suggestion, i tryed but i'm stuck with a
>ClassCastException. I'm now using the following code:
>===========
> DataContext ctxt =
> BasicServletConfiguration.getDefaultContext(request.getSession());
> SQLTemplate rawSelect = new SQLTemplate(Locatie.class,
> query.toString(), true);
> List locaties = ctxt.performQuery(rawSelect);
> PrefetchHelper.resolveToOneRelations(ctxt, locaties, "organisatie");
>
> iter=locaties.iterator();
> while(iter.hasNext()){
> Locatie l=(Locatie)iter.next();
> System.out.println(l.getNaam()+" - "+l.getLocatieId()+" -
> "+l.getOrganisatie().getNaam());
> }
>===========
>
>The "resolveToOneRelations()" functions throws the ClassCastException.
>I've traced it down to another line in cayenne itself:
>
>===========
>(in PrefetchHelper resolveToOneRelations() )
> List oids = new ArrayList(nobjects);
>
> for (int i = 0; i < nobjects; i++) {
> DataObject sourceObject = (DataObject) objects.get(i);
> DataObject targetObject =
> (DataObject) sourceObject.readPropertyDirectly(relName);
>
> ObjectId oid = targetObject.getObjectId();
> oids.add(oid);
> }
>===========
>
>The "(DataObject) sourceObject.readPropertyDirectly(relName);" throws the
>ClassCastException.
>
>Strange thing is when i try:
>===========
> DataContext ctxt =
> BasicServletConfiguration.getDefaultContext(request.getSession());
> SQLTemplate rawSelect = new SQLTemplate(Locatie.class,
> query.toString(), true);
> List locaties = ctxt.performQuery(rawSelect);
> //PrefetchHelper.resolveToOneRelations(ctxt,
> locaties, "organisatie"); //<- commented out
>
> iter=locaties.iterator();
> while(iter.hasNext()){
> Locatie l=(Locatie)iter.next();
> System.out.println(l.getNaam()+" - "+l.getLocatieId()+" -
> "+l.getOrganisatie().getNaam());
> }
>===========
>everything goes oke. When i call "l.getOrganisatie().getNaam()" the
>relationship object is extracted from the database automatic (i see a query).
>
>My relationship looks like:
>===========
>Locatie has a one to one relationship with Organisatie. The relationship
>is called "organisatie" and points to target "Organisatie".
>
><db-entity name="Locatie">
> <db-attribute name="locatieid" type="INTEGER"
> isPrimaryKey="true" isMandatory="true"/>
> <db-attribute name="naam" type="VARCHAR"
> isMandatory="true" length="255"/>
> <db-attribute name="organisatieid" type="INTEGER"/>
> </db-entity>
>
><db-entity name="Organisatie">
> <db-attribute name="naam" type="VARCHAR"
> isMandatory="true" length="255"/>
> <db-attribute name="organisatieid" type="INTEGER"
> isPrimaryKey="true" isMandatory="true"/>
> </db-entity>
>
><obj-relationship name="organisatie" source="Locatie" target="Organisatie"
>db-relationship-path="organisatie"/>
>
><obj-relationship name="locaties" source="Organisatie" target="Locatie"
>db-relationship-path="locaties"/>
>===========
>
>I suspect that i have the wrong value in the third parameter of
>resolveToOneRelations, but i can't seem to find one that's working (i've
>tryed Organisatie, organisatie.naam, organisatie, organisatieid).
>
>Here's the orginal exception trace:
>===========
>java.lang.ClassCastException
> at
> org.objectstyle.cayenne.access.util.PrefetchHelper.resolveToOneRelations(PrefetchHelper.java:98)
> at x.zoeken.ZoekAction.myExecute(ZoekAction.java:66)
> at x.BasisAction.execute(BasisAction.java:33)
> at
> org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
> at
> org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
> at
> org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
> at
> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
>===========
>
>Twan
>
>
This archive was generated by hypermail 2.0.0 : Wed Aug 25 2004 - 05:39:25 EDT