Actually there is a trick involved in naming columns from the joined
tables. So you'd still call 'addPrefetch', but also prefix each joined
column with a DB relationship name. E.g.:
#result('granteeId' 'String' 'myRel.granteeId')
(Note to self - document this under "Advanced SQLTemplate")
Andrus
On Aug 25, 2008, at 9:58 PM, Mike Kienenberger wrote:
> 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 : Tue Aug 26 2008 - 08:23:12 EDT