Yeah, that's a limitation of DeleteQuery (which btw is deprecated in
3.0, replaced with EJBQLQuery). It is mapped to a single table SQL
delete statement and does not support joins. In 2.0 your alternative
is SQLTemplate. In 3.0 - SQLTemplate and EJBQLQuery (that would allow
to use subqueries in the WHERE clause, but still no joins).
Andrus
On Feb 27, 2008, at 11:56 AM, Dave Merrin wrote:
> Hi,
>
> I'm trying to delete records from a database table based on some
> info in another related table. Unfortunately I'm getting an
> exception when using the DeleteQuery. Has this been fixed or is
> there any other way to delete like this?
>
> java.lang.RuntimeException: db relationships not supported
> at
> org
> .apache
> .cayenne
> .access
> .trans.DeleteTranslator.dbRelationshipAdded(DeleteTranslator.java:37)
> at
> org
> .apache
> .cayenne
> .access
> .trans.QueryAssemblerHelper.appendObjPath(QueryAssemblerHelper.java:
> 103)
> at
> org
> .apache
> .cayenne
> .access
> .trans.QualifierTranslator.objectNode(QualifierTranslator.java:339)
> at org.apache.cayenne.exp.Expression.traverse(Expression.java:
> 514)
> at org.apache.cayenne.exp.Expression.traverse(Expression.java:
> 511)
> at org.apache.cayenne.exp.Expression.traverse(Expression.java:
> 491)
> at
> org
> .apache
> .cayenne
> .access
> .trans.QualifierTranslator.doTranslation(QualifierTranslator.java:74)
> at
> org
> .apache
> .cayenne
> .access.trans.DeleteTranslator.createSqlString(DeleteTranslator.java:
> 51)
> at
> org
> .apache
> .cayenne
> .access.trans.QueryAssembler.createStatement(QueryAssembler.java:95)
> at
> org
> .apache
> .cayenne.access.jdbc.UpdateAction.performAction(UpdateAction.java:91)
> at
> org
> .apache
> .cayenne
> .access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:59)
> at
> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273)
> at
> org
> .apache
> .cayenne
> .access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:319)
> at org.apache.cayenne.access.DataDomainQueryAction.access
> $000(DataDomainQueryAction.java:60)
> at org.apache.cayenne.access.DataDomainQueryAction
> $1.transform(DataDomainQueryAction.java:291)
> at
> org
> .apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:
> 820)
> at
> org
> .apache
> .cayenne
> .access
> .DataDomainQueryAction
> .runQueryInTransaction(DataDomainQueryAction.java:288)
> at
> org
> .apache
> .cayenne
> .access.DataDomainQueryAction.execute(DataDomainQueryAction.java:109)
> at
> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:730)
> at
> org
> .apache
> .cayenne
> .util
> .ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:217)
> at
> org
> .apache
> .cayenne
> .access.DataContextQueryAction.execute(DataContextQueryAction.java:54)
> at
> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1386)
> at
> org
> .apache
> .cayenne.access.DataContext.performGenericQuery(DataContext.java:1341)
> at
> org
> .apache
> .cayenne
> .access.DataContext.performNonSelectingQuery(DataContext.java:1396)
> at
> ipa
> .printexpress
> .datahelpers.Session.deleteEntityCollection(Session.java:172)
> at
> ipa
> .px
> .tracker
> .trackerserver
> .purge.PurgeDatabaseHelper.purgeElements(PurgeDatabaseHelper.java:63)
> at
> ipa
> .px
> .tracker
> .trackerserver
> .purge.PurgeDatabaseHelper.purge(PurgeDatabaseHelper.java:476)
> at
> ipa
> .px
> .tracker
> .trackerserver.remoteobjects.Purger.purgeEditions(Purger.java:94)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun
> .reflect
> .NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun
> .reflect
> .DelegatingMethodAccessorImpl
> .invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
> at sun.rmi.transport.Transport$1.run(Transport.java:159)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
> at
> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:
> 535)
> at sun.rmi.transport.tcp.TCPTransport
> $ConnectionHandler.run0(TCPTransport.java:790)
> at sun.rmi.transport.tcp.TCPTransport
> $ConnectionHandler.run(TCPTransport.java:649)
> at java.util.concurrent.ThreadPoolExecutor
> $Worker.runTask(ThreadPoolExecutor.java:885)
> at java.util.concurrent.ThreadPoolExecutor
> $Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:619)
>
> BTW. I'm using Cayenne version 2 (not sure which exact version but
> can find out if required).
>
> Cheers,
>
> Dave
>
This archive was generated by hypermail 2.0.0 : Wed Feb 27 2008 - 07:05:46 EST