> It can theoretically support DISJOINT_BY_ID, but IIRC it does not.

Actually I was wrong about this one. DISJOINT_BY_ID works just fine with 
SQLSelect, and will save you a lot of trouble mapping SQL:
List<Artist> result = SQLSelect.query(Artist.class, "SELECT "
        + "#result('ARTIST_NAME' 'String'), "
        + "#result('DATE_OF_BIRTH' 'java.util.Date'), "
        + "#result('t0.ARTIST_ID' 'int' '' 'ARTIST_ID') "
        + "FROM ARTIST t0")
        .addPrefetch(Artist.PAINTINGS.disjointById())
        .select(context);
I'll make sure we update the docs.

Andrus

> On Jul 30, 2020, at 9:11 AM, Andrus Adamchik <and...@objectstyle.org> wrote:
> 
> Hi,
> 
> We may need to make it more obvious in the API, but SQLSelect only supports 
> JOINT prefetching [1]. It can't support disjoint, as Cayenne has no way of 
> building the right WHERE clause for prefetch queries. It can theoretically 
> support DISJOINT_BY_ID, but IIRC it does not. 
> 
> So let's focus on JOINT... Unlike ObjectSelect that does all the prefetch SQL 
> building for you transparently, SQLSelect can't, so it is your responsibility 
> to include all the columns from the main and related entities in your result 
> set, and also (and this is important) to label all these columns properly, so 
> that Cayenne could figure out which objects they belong to. Here is an 
> example:
> 
> List<Artist> objects = SQLSelect.query(Artist.class, "SELECT "
>        + "#result('ESTIMATED_PRICE' 'BigDecimal' '' 
> 'paintings.ESTIMATED_PRICE'), "
>        + "#result('PAINTING_TITLE' 'String' '' 'paintings.PAINTING_TITLE'), "
>        + "#result('GALLERY_ID' 'int' '' 'paintings.GALLERY_ID'), "
>        + "#result('PAINTING_ID' 'int' '' 'paintings.PAINTING_ID'), "
>        + "#result('ARTIST_NAME' 'String'), "
>        + "#result('DATE_OF_BIRTH' 'java.util.Date'), "
>        + "#result('t0.ARTIST_ID' 'int' '' 'ARTIST_ID') "
>        + "FROM ARTIST t0, PAINTING t1 "
>        + "WHERE t0.ARTIST_ID = t1.ARTIST_ID")
>        .addPrefetch(Artist.PAINTINGS.joint())
>        .select(context);
> Here the result includes all the Artist columns (root entity), and all the 
> Painting columns (prefetched entity). Painting columns are labeled in the 
> format "[dbrelationship].[columnName]" (e.g. "paintings.ESTIMATED_PRICE").
> 
> HTH,
> Andrus
> 
> 
> [1] https://cayenne.apache.org/docs/4.1/cayenne-guide/#prefetching-semantics
> 
>> On Jul 22, 2020, at 11:28 PM, Jorge Gonçalves 
>> <jorge.fern.goncal...@gmail.com> wrote:
>> 
>> Hello,
>> 
>> I have to do some complex queries to data base and to do that on I'm writing 
>> them in SQL.
>> 
>> It works great with SQLSelect but when I need to prefetch something ( to 
>> avoid hundreds of queries when showing data in a tableView) it does not work,
>> 
>> from javaDoc it seems that prefetching with SQLSelect is possible but I have 
>> not found any info or example.
>> 
>> for example if i do:
>> 
>>       SelectQuery<Servico> query = new SelectQuery<>(Servico.class);
>> 
>>        query.addPrefetch("table1");
>>        query.addPrefetch("table3");
>>        query.addPrefetch("table4");
>> 
>>        getContext().performQuery(query);
>> 
>> cayenne makes 4 queries and all data is displayed on table.
>> 
>> but if I run:
>> 
>>   SQLSelect<Servico> query = new SQLSelect<>(Servico.class, "select * from 
>> servico;");
>> 
>>        query.addPrefetch("table1", PrefetchTreeNode.UNDEFINED_SEMANTICS);
>>        query.addPrefetch("table3", PrefetchTreeNode.UNDEFINED_SEMANTICS);
>>        query.addPrefetch("table4", PrefetchTreeNode.UNDEFINED_SEMANTICS);
>> 
>>        getContext().performQuery(query);
>> 
>> it makes hundreds of queries when trying to show data on table (like if no 
>> prefetch was made), I've tried to make a join but does not work either.
>> 
> 

Reply via email to