Robert,
Now I get it; Cayenne is totally cool!! :)
Here is the code I used:
ObjectContext oc = BaseContext.getThreadObjectContext();
Expression exp =
ExpressionFactory.likeIgnoreCaseExp("billAddress.lastName", "%clapt%");
SelectQuery query = new SelectQuery(Customer.class, exp);
List list = oc.performQuery(query);
Works great.
The essential component that I misunderstood was your dot-nomenclature
for the expression parameter. I had no idea that Cayenne supported
this "RelationshipProperty.PropertyName" type syntax. Very clever idea!
Thanks again. Cayenne is not only powerful but loads of fun to use. :)
Joe
On Mar 14, 2009, at 5:36 PM, Robert Zeigler wrote:
On Mar 14, 2009, at 3/144:22 PM , Joe Baldwin wrote:
Robert,
I am attempting a test but lost you on your Qualifier step.
SelectQuery query = new SelectQuery(Entity1.class);
This is easy.
query.setQualifier(ExpressionFactory.matchExp(Entity1.EN|
TITY2_PROPERTY,entity2));//where ENTITY2_PROPERTY is the name of
object property in entity1 that points to entity2
I don't follow this step. You are obviously using the
ExpressionFactory to create a qualifier expression for the query
but I don't follow the match expression.
Lets say that entity1 is "Customer" and entity2 is "Detail". So
the code snippet would be
ExpressionFactory.matchExp(Customer.DETAIL_PROPERTY, entity2)
I don't understand what entity2 stands for in this example. In
addition, I am trying to select based on the contents of the
entity2 field, so I am even more confused as to how this would
accomplish that objective.
Ok, Customer -> Detail.
I'm still a little unclear on exactly what you're trying to do,
based on your comment "based on the contents of the entity2 field",
so I'll step through two scenarios:
1) You have a "detail" object reference, and you want to get the
corresponding "customer".
Then entity2 would be your detail object.
ExpressionFactory.matchExp() takes a property path as its first
argument and the corresponding value to match as its second.
So,
ExpressionFactory
.matchExp
(Customer.DETAIL_PROPERTY,someDetailForWhichYouHaveAReference);
Of course, if this is a two-sided one-to-one (detail has a property
for customer, as well as customer having a property for detail),
then you could always just do:
detail.getCustomer(); :)
2) You have some information related to a property of detail, say,
"description".
So the property path, from customer, might look like:
"detail.description" (assuming customer is the root object of the
property path).
Or, you could write it as:
Customer.DETAIL_PROPERTY + "." + Detail.DESCRIPTION_PROPERTY
So you could do:
ExpressionFactory.matchExp(Customer.DETAIL_PROPERTY + "." +
Detail.DESCRIPTION_PROPERTY,"the description string")
Or you could use a like expression:
ExpressionFactory.likeExp(Customer.DETAIL_PROPERTY + "." +
Detail.DESCRIPTION_PROPERTY,"the description to partial match");//
<-- add % wildcards yourself here.
HTH,
Robert
List<Entity1> e1 = objectContext.performQuery(query);//note:
perform query is NOT generified, so you'll get a warning here.
This seems easy as well.
Thanks,
Joe
On Mar 14, 2009, at 3:53 PM, Robert Zeigler wrote:
Hi Joe,
How about:
SelectQuery query = new SelectQuery(Entity1.class);
query.setQualifier(ExpressionFactory.matchExp(Entity1.EN|
TITY2_PROPERTY,entity2));//where ENTITY2_PROPERTY is the name of
object property in entity1 that points to entity2
List<Entity1> e1 = objectContext.performQuery(query);//note:
perform query is NOT generified, so you'll get a warning here.
Robert
On Mar 14, 2009, at 3/141:29 PM , Joe Baldwin wrote:
I am attempting to create the simplest Cayenne-expedient method
of doing the following query. (I can easily do this in SQL but am
a tad confused with the Cayenne Expression method.)
I have an Entity (E1) with a one to one relationship with a
second entity (E2). I would like to perform a SELECT Query with
a filter on one of the fields of the relationship-entity (E2.F1)
and return a list of the first entity (E1List).
What is the most efficient Cayenne way to do this? (I am still a
bit confused concerning how to construct efficient queries in the
object domain vs the relational domain.)
Thanks,
Joe