Need to experiment with this one. Looks like it may need some adjustment.

> On Oct 20, 2021, at 9:29 PM, Nikita Timofeev <ntimof...@objectstyle.com> 
> wrote:
> 
> Hi all,
> 
> This behavior is still in 4.2. To make it odder, selecting a single
> column would return all rows like with suppressDistinct() call.
> This is caused by the logic deep inside mapping result rows to objects
> [1], that came, I believe, from the EJBQL.
> Not sure I know why it's there, though.
> 
> [1] 
> https://github.com/apache/cayenne/blob/master/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java#L816
> 
> On Wed, Oct 20, 2021 at 8:28 AM Andrus Adamchik <aadamc...@gmail.com> wrote:
>> 
>> Yeah, this seems wrong. "Historically" distinct would be implicitly added 
>> (either to SQL or to the processed result) when a query condition contained 
>> to-many relationships. The goal was to preserve the abstraction of an 
>> "object" query, and return the same consistent result regardless of the SQL 
>> specifics.
>> 
>> This is not the case here, as the query is not object-based, neither there 
>> is a to-many relationship involved.
>> 
>> I recall we discussed it with Nikita long time ago, just don't remember what 
>> the outcome of that discussion was :) Maybe Nikita can shed some light?
>> 
>> Andrus
>> 
>>> On Oct 19, 2021, at 4:57 PM, Hugi Thordarson <h...@karlmenn.is> wrote:
>>> 
>>> Followup—I added .suppressDistinct() to the ObjectSelect and that fixed my 
>>> problem, i.e. the list contained all 462.653 rows.
>>> 
>>> However, I'm still a bit flummoxed… I didn't realize the fetch was distinct 
>>> because the "distinct" keyword did not appear in the generated SQL. 
>>> However, the keyword *is* added to the SQL if I explicitly specify 
>>> distinct(). Somewhat odd.
>>> 
>>> Note that all of this is on Cayenne 4.1 and I haven't tried this on 4.2 
>>> (where everything is changed behind the scenes). Perhaps all of this is 
>>> different there and I should just keep silent for now? :)
>>> 
>>> Cheers,
>>> - hugi
>>> 
>>> 
>>> 
>>>> On 19 Oct 2021, at 13:45, Hugi Thordarson <h...@karlmenn.is> wrote:
>>>> 
>>>> Hi all,
>>>> let's say I'm performing a simple single column fetch. Example:
>>>> 
>>>> --------------------------------------------------
>>>> List<Object[]> customers = ObjectSelect
>>>>     .query( Customer.class )
>>>>     .columns( Customer.CPRNR )
>>>>     .select( oc );
>>>> 
>>>> System.out.println( "Customers: " + customers.size() );
>>>> --------------------------------------------------
>>>> 
>>>> This generates the following output:
>>>> 
>>>> --------------------------------------------------
>>>> - --- transaction started.
>>>> - SELECT "t0"."cprnr" FROM "nb_customer" "t0"
>>>> - === returned 462653 rows. - took 210 ms.
>>>> - +++ transaction committed.
>>>> Customers: 169770
>>>> --------------------------------------------------
>>>> 
>>>> As you can see, the fetch returns 462.653 rows which is the number of 
>>>> customers in the DB, and the number I expected.
>>>> However, the resulting list only contains 169.770 objects—the number of 
>>>> distinct values of CPRNR.
>>>> 
>>>> Why? It's not a distinct fetch. I'm feeling particularly stupid today, and 
>>>> I'm definitely missing something here, I just don't understand what :).
>>>> 
>>>> Cheers,
>>>> - hugi
>>> 
>> 
> 
> 
> -- 
> Best regards,
> Nikita Timofeev

Reply via email to