Expression.fromString() does indeed take a string, but allows for
placeholders, too:
Expression expression = Expression.fromString("lastName = $lastName");
Map parameters = new HashMap(1);
parameters.put("lastName", "andy");
SelectQuery query = new SelectQuery(Person.class,
expression.expWithParameters(parameters));
Should allow you to put booleans (and other values) in there, too. In
general, though, I agree with John that it is better (safer --
compiler can check values) to use the ExpressionFactory.* methods.
mrg
On Fri, Jun 1, 2012 at 10:44 AM, Andrew Faust <[email protected]> wrote:
> Hey John appreciate the fast response...thanks.
>
> So....
> String myFilter = "lastName = 'andy'"
> I understand that.... However
> String myFilter = "isStaffMember = 'true'"
> How do you translate that into it's "object" form as you recommended? The
> Expression.*fromString* method requires a String. Are you suggesting I use
> a different filtering method that takes objects as parametes and not
> strings? Thanks again..
>
> On Fri, Jun 1, 2012 at 10:31 AM, John Huss <[email protected]> wrote:
>
>> The string 'true' is not the same as the literal value true. Same for
>> dates. You need to pass these objects in object form, not as strings.
>>
>> On Fri, Jun 1, 2012 at 8:59 AM, Andrew Faust <[email protected]> wrote:
>>
>> > Good morning everybody. I am using the following code with (mostly) good
>> > results:
>> >
>> >
>> > =============================================================
>> >
>> > String filterExpr = "*lastName* = 'Simth';
>> >
>> > SelectQuery personQuery = new SelectQuery(Person.*class*);
>> >
>> > List<Person> fullPersonList = ormContext.performQuery(personQuery);
>> >
>> > Expression filterExp = Expression.*fromString*(filterExpr);
>> >
>> > List<Person> filteredPersonList =
>> filterExp.filterObjects(fullPersonList);
>> >
>> > =============================================================
>> >
>> > This works well on any combination of operators such as =, >, <, and so
>> > on. This also worrks ok with numeric fields. So, for string and numeric
>> > fields this code works ok.
>> >
>> >
>> >
>> > *HOWEVER*; when I try to filter fields that are booleans or dates then I
>> *
>> > always* get back an empty results set. For example...
>> >
>> >
>> >
>> > Change filterExpr to *filterExpr = "isStaffMember = 'true'"* runs ok but
>> > returns 0 records which is NOT correct. Note that if I don't use the '
>> > character then I get runtime EXCEPTIONS.
>> >
>> > Change filterExpr to *filterExpr = "startDate = '2012-02-01'" *again runs
>> > ok but returns 0 records which is NOT correct.
>> >
>> >
>> >
>> > Here are some of my runtime particulars:
>> >
>> > JDK/JRE: 1.6.0_31
>> >
>> > Cayenne version: 3.0.2
>> >
>> > DerbyDB version: 10.8.1.2
>> >
>> > The database/java fields are: String=VARCHAR/String; numbers are
>> > integer/Integer; dates are DATE/Date; and booleans are boolean/Boolean.
>> >
>> >
>> >
>> > In summary, the filterExpFilterObjects(...) seems to work fine IF the
>> > fields are strings or numbers; but is NOT working as expected with Dates
>> or
>> > Booleans. Any ideas anyone?
>> >
>>