Re: Qualifier Expression

From: Mike Kienenberger (mkienen..mail.com)
Date: Mon Mar 16 2009 - 11:01:26 EDT

  • Next message: jbryanlewi..mail.com: "building 3.0 cayenne source"

    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 <jfbaldwi..arthlink.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
    >>>>>
    >>>>>
    >>>>>
    >>>>
    >>>
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Mon Mar 16 2009 - 11:02:07 EDT