Well unfortunately this doesn't appear to be working. This is my first time
to try and use the db: prefix in an Expression and from what I can tell no
code actually attempted to parse it. Am I misusing this prefix capability?
All I'm really doing is
1) determine the PK name (assumption of a single PK, since we are
controlling the schema):
ObjEntity entity = resolver.getObjEntity(className);
String pkName =
entity.getPrimaryKeyNames().iterator().next();
This appears to work fine.. pkName == "ID"
2) Create an IN expression with my group of id ints
Expression expr = ExpressionFactory.inExp("db:" + pkName, idValues);
3) Potentially join that expression with some others using
Expression.joinExp()
4) create new SelectQuery:
SelectQuery q = new SelectQuery(className, expr);
5) Fire away
retList = performQuery(q);
I get the following exception:
org.apache.cayenne.exp.ExpressionException: [v.3.0M5 Nov 29 2008 21:12:47]
Can't resolve path component: [Advertiser.db:ID].
at
org.apache.cayenne.map.PathComponentIterator.invalidPathException(PathComponentIterator.java:145)
at
org.apache.cayenne.map.PathComponentIterator.next(PathComponentIterator.java:133)
at
org.apache.cayenne.map.PathComponentIterator.next(PathComponentIterator.java:33)
at
org.apache.cayenne.access.trans.QueryAssemblerHelper.appendObjPath(QueryAssemblerHelper.java:91)
at
org.apache.cayenne.access.trans.QualifierTranslator.objectNode(QualifierTranslator.java:343)
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(QualifierTranslator.java:65)
at
org.apache.cayenne.access.trans.QueryAssemblerHelper.appendPart(QueryAssemblerHelper.java:73)
at
org.apache.cayenne.access.trans.SelectTranslator.createSqlString(SelectTranslator.java:117)
....
Is there a problem with me using a db: prefixed path in a normal
SelectQuery? Can anyone point me at the code that attempts to do this db:
parse so I can try and step through? I'm rather stumped on this one.
Thanks!
Dave
On Thu, Apr 2, 2009 at 1:36 PM, Dave Lamy <davelam..mail.com> wrote:
> Thanks guys.
>
> I'm actually in the middle of putting together some code that will grab the
> ObjEntity and use the getPrimaryKeyNames() method to get the name of the
> PK.. then just create the expression using "db:" + pkName. I'll let
> everyone know how that goes.. if not great then I can back up to use this
> instead.
>
> Dave
>
>
> On Thu, Apr 2, 2009 at 1:30 PM, Andrey Razumovsky <
> razumovsky.andre..mail.com> wrote:
>
>> This is possible. See
>> http://cwiki.apache.org/CAY/mapping-primary-keys.html
>> Also, as far as I know new modeler has checkbox option for auto-generating
>> primary key attrs at reverse-engineering
>>
>> 2009/4/2 Dave Lamy <davelam..mail.com>
>>
>> > No, I didn't.. just did the standard Cayenne mapping with a database ID
>> > column (auto-generated) which of course is not exposed in the Java
>> class.
>> > What makes this even more fun is that I'm using a generic persistent
>> class
>> > in several cases, so I don't have concrete Java classes/paths to work
>> with.
>> > Was hoping to use some sort of pseudo-path like Hibernate's ".id" field
>> in
>> > hql.
>> >
>> > So far the only real solution to this that I can see is to use a
>> consistent
>> > PK column naming scheme.. like "ID".. and then use a db:ID path
>> expression.
>> > But it's not ideal.
>> >
>> > On Thu, Apr 2, 2009 at 12:01 PM, Michael Gentry <mgentr..asslight.net
>> > >wrote:
>> >
>> > > Did you map your primary key as a Java attribute? If so, just include
>> > it.
>> > >
>> > >
>> > > On Thu, Apr 2, 2009 at 12:53 PM, Dave Lamy <davelam..mail.com>
>> wrote:
>> > > > I am composing a SelectQuery and want to include an expression to
>> > narrow
>> > > my
>> > > > results based upon the primary key (just an int ID) as well as other
>> > > > criteria. I am using the ExpressionFactory to generate the
>> > Expressions..
>> > > > specifically I have
>> > > >
>> > > > Expression expr = ExpressionFactory.inExp(<pathToId?>,
>> idCollection);
>> > > >
>> > > > Question is: How do I represent the path to the primary key in an
>> > > > expression string like this?
>> > > >
>> > > > Thanks--
>> > > > Dave
>> > > >
>> > >
>> >
>>
>
>
This archive was generated by hypermail 2.0.0 : Fri Apr 03 2009 - 16:49:32 EDT