You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by "Becker, Joel" <jo...@essvote.com> on 2011/11/04 20:15:40 UTC
Clone and modify DataMap - NullPointerException with SelectQuery with Expression
Hi, I wrote code to clone a DataMap, appending a suffix to the Entities
to avoid name collisions (in this instance I am not cloning the
relationships). After adding the cloned DataMap to the data node, I can
successfully commit transactions to the dynamically-generated tables. I
can also query for all of the objects in the tables (they are
CayenneDataObjects, since I can't generate new Java classes
dynamically).
However, when I create a SelectQuery given the DbEntity and an
Expression, where the expression is
ExpressionFactory.matchEquals(MaritalStatus.DESCRIPTION_PROPERTY,
"Married"), and call DataContext.performQuery(), I get a
NullPointerException here:
java.lang.NullPointerException
at
org.apache.cayenne.access.trans.QueryAssemblerHelper.appendObjPath(Query
AssemblerHelper.java:141)
at
org.apache.cayenne.access.trans.QualifierTranslator.objectNode(Qualifier
Translator.java:376)
at
org.apache.cayenne.exp.Expression.traverse(Expression.java:464)
at
org.apache.cayenne.exp.Expression.traverse(Expression.java:461)
at
org.apache.cayenne.exp.Expression.traverse(Expression.java:441)
at
org.apache.cayenne.access.trans.QualifierTranslator.doAppendPart(Qualifi
erTranslator.java:76)
at
org.apache.cayenne.access.trans.QualifierTranslator.doAppendPart(Qualifi
erTranslator.java:65)
at
org.apache.cayenne.access.trans.QueryAssemblerHelper.appendPart(QueryAss
emblerHelper.java:83)
at
org.apache.cayenne.access.trans.SelectTranslator.createSqlString(SelectT
ranslator.java:130)
at
org.apache.cayenne.access.trans.QueryAssembler.createStatement(QueryAsse
mbler.java:194)
at
org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.j
ava:70)
at
org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryActi
on.java:87)
at
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:269)
at
org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQuery
Action.java:422)
at
org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQue
ryAction.java:69)
at
org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQu
eryAction.java:395)
at
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:85
0)
at
org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(Da
taDomainQueryAction.java:392)
at
org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryA
ction.java:121)
at
org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:743)
at
org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQ
ueryAction.java:333)
at
org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQu
eryAction.java:96)
at
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1278)
at
org.apache.cayenne.access.DataContext.performQuery(DataContext.java:1267
)
At the QueryAssemblerHelper.appendObjPath() line:
for (PathComponent<ObjAttribute, ObjRelationship> component :
getObjEntity()
because getObjEntity() returns null because the query's classDescriptor
is null.
When I clone the DataMap, do I need to create a ClassDescriptor for each
ObjEntity? If so, is that possible for dynamic ObjEntity's which don't
have a real corresponding Java class?
Thanks,
Joel