Great! Let me try to guess about the nature of this error. EJBQL is resolved to SQLTemplate in the backend as an intermediate step. So I suspect the root of the generated SQLTemplate is set to Java class instead of entity name.

Andrus


On Jun 10, 2009, at 5:52 PM, Dave Lamy wrote:
Thanks for the FYI Andrus.

I'll just punt to a named query for the time being. Thanks for logging in the JIRA. My concern would be that it would probably be a low- priority issue (since I'm apparently the only person who has come across this).. to that end, I'd be more than happy to look into the solution impl, but would definitely like to have someone to lean on as I dig into the call stack.. if you or anyone else could point me at some code on the SelectQuery side that does the entity-by-name lookup correctly, and a general point at the area of
EJBQL that needs work, I can get my hands dirty and help.

Thanks again for the great product and support--
Dave

On Wed, Jun 10, 2009 at 7:37 AM, Andrus Adamchik <[email protected] >wrote:

From what I can tell, nobody ever looked at this scenario (EJBQL with
generic entities) yet, so I am not surprised it is broken. Let me log a Jira
to investigate the issue. Sorry, this also means you'll have to use
SQLTemplate.

Andrus



On Jun 10, 2009, at 12:14 AM, Dave Lamy wrote:

Hey guys-- I'm trying to get group functions operational in my
Cayenne-backed system. As far as I can tell, the only support for group functions (min, max, count, etc) outside of rolling my own SQL is EJBQL..
is
that true or am I missing something?

Assuming this is the case: I'm having issues with my EJBQL working when I reference a generic Cayenne class. IE, my "Artist" data class doesn't
have
a strong class implementation.. it just uses a standard base class. This
feature has been great and is absolutely essential to our software.
However, in my test case I have a simple Artist class with no concrete
impl:

<obj-entity name="Artist" lock-type="optimistic" dbEntityName="ARTIST"
superClassName="com.routeto1.data.DynamicDataObject">
    <obj-attribute name="address" type="java.lang.String"
db-attribute-path="ADDRESS"/>
    <obj-attribute name="name" type="java.lang.String"
db-attribute-path="NAME"/>
    <obj-attribute name="type" type="java.lang.String"
db-attribute-path="TYPE"/>
</obj-entity>

when I try to execute a simple EJBQL group test query:

select count(a), a.name from Artist a group by a.name

I get the following exception:

org.apache.cayenne.CayenneRuntimeException: [v.3.0M5 Nov 29 2008 21:12:47]
Can't perform lookup. There is more than one ObjEntity mapped to
com.routeto1.data.impl.DynamicDataObject
at

org .apache .cayenne.map.EntityResolver._lookupObjEntity(EntityResolver.java: 847)
at

org .apache .cayenne.map.EntityResolver.lookupObjEntity(EntityResolver.java:701)
at

org .apache .cayenne.query.BaseQueryMetadata.resolve(BaseQueryMetadata.java:99)
at

org .apache .cayenne .query.SQLTemplateMetadata.resolve(SQLTemplateMetadata.java:47)
at
org.apache.cayenne.query.SQLTemplate.getMetaData(SQLTemplate.java: 157)
at

org .apache .cayenne .access.jdbc.SQLTemplateAction.<init>(SQLTemplateAction.java:77)
at

org .apache .cayenne.dba.JdbcActionBuilder.sqlAction(JdbcActionBuilder.java:90)
at

org .apache .cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java:100)
at

org .apache .cayenne .access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:57) at org.apache.cayenne.access.DataNode.performQueries(DataNode.java: 236)
at

org .apache .cayenne .access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java: 423)
at

org.apache.cayenne.access.DataDomainQueryAction.access $000(DataDomainQueryAction.java:67)
....

which seems to read like the EJBQL impl doesn't support the generic base class concept. Am I right on this? I don't care about EJBQL, just want
to
get group functions working without having to resort to rolling a bunch of dynamic SQL :-). Perhaps an upgrade to M6 is in order? Thanks in advance
for any help you can provide!

--Dave Lamy




Reply via email to