You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by "Nikita Timofeev (JIRA)" <ji...@apache.org> on 2018/03/27 09:57:00 UTC

[jira] [Closed] (CAY-1884) setDistinct on SelectQuery generates a wrong MySql query

     [ https://issues.apache.org/jira/browse/CAY-1884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nikita Timofeev closed CAY-1884.
--------------------------------
    Resolution: Fixed

> setDistinct on SelectQuery generates a wrong MySql query
> --------------------------------------------------------
>
>                 Key: CAY-1884
>                 URL: https://issues.apache.org/jira/browse/CAY-1884
>             Project: Cayenne
>          Issue Type: Bug
>    Affects Versions: 3.1B2
>         Environment: Tomcat 6
>            Reporter: Ramiro Aparicio
>            Priority: Minor
>         Attachments: ProtOnMap.zip
>
>
> I have the following mapping
> User is related with User via a mapping table named Contact, the PK is an id as the User can contact the same target several times.
> I wanted to get all distinct Users contacted by A, so as I wasn't really sure if I needed distinct or not so in the first try I enabled it and the SQL generated makes no sense.
> My code:
>         SelectQuery query =
>                 new SelectQuery(User.class, ExpressionFactory.matchExp(Cayenne.makePath(User.CONTACTED_BY_ARRAY_PROPERTY, Contact.TO_CONTACT_OWNER_PROPERTY), owner));
>         query.setDistinct(true);
>         return performQuery(query);
> The generated SQL query using a non null "owner":
> SELECT DISTINCT t0.idUser, t0.location, t0.PaymentInvoicingData_idInvoicingData, t0.password, t0.ProtOnDomain_idProtOnDomain, t0.username, t0.isPremium, t0.permissionsReadonly, t0.ProtonDomainLDAP_idDomainLdap, t0.lockExternalVisibility, t0.usernameVisibility, t0.locked, t0.Partner_idPartner, t0.CorporateServer_externalIdServer, t0.premium_expiration_notification, t0.completeName, t0.externalIdUser, t0.deleted, t0.isDomainAdmin, t0.accessReadonly, t0.profileReadonly, t0.externalUsername, t0.accountType, t0.premiumExpiration
> FROM user t0
>     JOIN contact t1 ON (t0.idUser = t1.contactTarget)
> WHERE t1.idContact = NULL
> The SQL when distinct is commented:
> SELECT DISTINCT t0.idUser, t0.location, t0.PaymentInvoicingData_idInvoicingData, t0.password, t0.ProtOnDomain_idProtOnDomain, t0.username, t0.isPremium, t0.permissionsReadonly, t0.ProtonDomainLDAP_idDomainLdap, t0.lockExternalVisibility, t0.usernameVisibility, t0.locked, t0.Partner_idPartner, t0.CorporateServer_externalIdServer, t0.premium_expiration_notification, t0.completeName, t0.externalIdUser, t0.deleted, t0.isDomainAdmin, t0.accessReadonly, t0.profileReadonly, t0.externalUsername, t0.accountType, t0.premiumExpiration 
> FROM user t0
>     JOIN contact t1 ON (t0.idUser = t1.contactTarget)
> WHERE t1.contactOwner = ?
> [bind: 1->contactOwner:201]
> As I said owner is not null in both cases but for some reason setting distinct forgets about the real target to match.
>  idContact is an AI PK so that would make sense if I was matching against a Contact object but no when using a User object to match against.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)