I've confirmed this by stepping through the code.. the root is definitely set to the base class.
I haven't yet found the exact place where it all happens.. EJBQLCompiledExpression only returns a ClassDescriptor for getRootDescriptor, so I guess that's a good place to start.. Dave Wed, Jun 10, 2009 at 10:24 AM, Andrus Adamchik <[email protected]>wrote: > 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 >>>> >>>> >>> >>> >
