Re: Using SQLTemplate to prefetch relationships.

From: Mike Kienenberger (mkienen..mail.com)
Date: Mon Aug 25 2008 - 14:58:38 EDT

  • Next message: Ian Jamieson: "Object Cache"

    I'm not an expert on prefetching.

    However, my guess is that you need to use addPrefetch() and let the
    framework do the right thing rather than trying to put it into your
    sql-template.

    On 8/25/08, Michael Shea <mik..itido.com> wrote:
    > Hi,
    >
    > I am attempting to use a SQLTemplate to execute a query and prefetch
    > relationships. I have been unable, so far, to get any relationships that are
    > one-to-many to be prefetched. Is there any further documentation about
    > prefetching dependencies with SQLTemplate? So far, all I have seen is this:
    >
    > http://cayenne.apache.org/doc/prefetching.html
    >
    > This basically just indicates that SQLTemplate uses JOINT semantics to
    > prefetch, which makes sense. Presumably, the query must manually retrieve
    > all the desired relationships, and I should call template.addPrefetch(...)
    > for every relationship I want retrieved?
    >
    > How should I retrieve the actual properties of the relationship objects? So
    > far, I have been using:
    >
    > select ...
    > #result('granteeId' 'String' )
    > ...
    >
    > where granteeId is a property of an object related to the root object of
    > the query.
    >
    > However, I get back errors like this:
    >
    > org.apache.cayenne.CayenneRuntimeException: [v.2.0.4
    > October 8 2007] Null value for 'granteeId'. Snapshot:
    > org.apache.cayenne.DataRo..61aef[values={permissionItemId=aa869cb60ca18870:70f1774a:11bfb2de554:-8000,
    > granteeId=null, permissionType=null, isGrantable=null},
    > version=-9223372036854775793,
    > replaces=-9223372036854775808]. Prefix: null
    > at
    > org.apache.cayenne.access.ObjectResolver.createObjectId(ObjectResolver.java:278)
    > ...
    > When I run the query myself, manually, I can see that the value of
    > granteeId returned by the query isn't null.
    >
    > I have also tried calling template.setFetchingDataRows( false ) and then
    > calling context.objectsFromDataRows() on the result of executing the query,
    > but so far that has just generated me one object per datarow (so if a root
    > object has 4 related dependent objects, I end up getting back 4 distinct
    > root objects, rather than 1 root with 4 objects in the appropriate
    > relationship).
    >
    > Any suggestions? If this is unclear, please let me know and I will try to
    > clarify =)
    >
    > Oh, I am using version 2.0.4 of Cayenne.
    >
    > Thanks!
    >
    >
    > Mike Shea.
    >



    This archive was generated by hypermail 2.0.0 : Mon Aug 25 2008 - 14:59:15 EDT