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


Reply via email to