cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dave Lamy (JIRA)" <j...@apache.org>
Subject [jira] Updated: (CAY-1391) EJBQL unable to reference PKs not mapped as ObjAttributes
Date Thu, 11 Feb 2010 22:56:28 GMT

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

Dave Lamy updated CAY-1391:
---------------------------

    Attachment: EJBQLSelectTranslatorTest.patch
                EJBQLPathTranslator.patch

Attaching patches for both translator code as well as unit test

> EJBQL unable to reference PKs not mapped as ObjAttributes
> ---------------------------------------------------------
>
>                 Key: CAY-1391
>                 URL: https://issues.apache.org/jira/browse/CAY-1391
>             Project: Cayenne
>          Issue Type: Improvement
>          Components: Core Library
>    Affects Versions: 3.0RC2
>            Reporter: Dave Lamy
>         Attachments: EJBQLPathTranslator.patch, EJBQLSelectTranslatorTest.patch
>
>
> I hit a case where an ObjEntity that contained an auto-generated PK needed to be referenced
by an EJBQL query.  The PK is not mapped as an ObjAttribute.
> The specific query case is when trying to perform a COUNT query with criteria on a to-many
association, such as:
> SELECT count(p) FROM Parent p JOIN p.children c WHERE c.age > 5
> The result in this case will be erroneous, as the generated SQL will count duplicated
parent IDs across the cartesian join on the children.
> The SQL fix for this is to include a DISTINCT in the count, but requesting a count(distinct
p) does not produce workable SQL.  Ideally then, one could reference the PK of the parent.
> I've written a solution to this using an HQL-esque "id" property to be referenced in
the select.  Thus this statement will work properly:
> SELECT count(distinct p.id) FROM Parent p JOIN p.children c WHERE c.age > 5
> The code will attempt to use the "normal" ObjAttribute discovery method first; but failing
that, if the last path component == "id" and the ObjEntity has a single PK then it will utilize
the PK ObjAttribute from the ObjEntity.  
> This code works on both my production test case as well as in the unit test.  Please
consider for inclusion in the next release, I hate monkey patches!

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message