cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mike Kienenberger <mkien...@gmail.com>
Subject Re: Qualifier Expression
Date Mon, 16 Mar 2009 15:01:26 GMT
Joe,

In case you didn't catch it, the following isn't psuedo-code.

> Or, you could write it as:
> Customer.DETAIL_PROPERTY + "." + Detail.DESCRIPTION_PROPERTY

You can use the following to keep your java code clean of hardcoded
modeler attribute and relationship names:

    Customer.BILL_ADDRESS_RELATIONSHIP + "." + Address.LAST_NAME_PROPERTY

instead of

    "billAddress.lastName"


Not also that the path syntax can traverse an arbitrary number of
relationship path components:   "a.b.c.d.e.property" to traverse 6
entity joins.


On Sat, Mar 14, 2009 at 6:25 PM, Joe Baldwin <jfbaldwin@earthlink.net> wrote:
> 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
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>
>

Mime
View raw message