I tested it as follows:

Expression e = FunctionExpressionFactory.lowerExp("name”);

StringProperty<String> LOWER_NAME = PropertyFactory.createString("lowerName", 
e, String.class);
String lowerName = ObjectSelect.columnQuery(Artist.class, LOWER_NAME)
                .where(LOWER_NAME.eq("leonardo da vinci"))
                .selectFirst(context);
                
System.out.println("Lower name is " + lowerName);


> On Sep 30, 2025, at 5:42 PM, Ricardo Parada <[email protected]> wrote:
> 
> Thank you Andrus,
> 
> I had figured it out.  I’m finding the API easier to work with than EOF.
> 
> I like that these expressions can then be used with 
> ObjectSelect.columnQuery() etc. and I don’t have to attach them to the 
> entities like we did with EOF using derived attributes.
> 
> Regards,
> Ricardo
> 
> 
> 
>> On Sep 29, 2025, at 2:43 PM, Andrus Adamchik <[email protected]> wrote:
>> 
>> One way is to use ExpressionFactory to further build the expression, but it 
>> is kinda ugly. Let me rather give a very compact property-based example:
>> 
>> Expression e = MyEntity.DELTA.abs().gt(10)
>> 
>> Should've thought of that before :)
>> 
>> Andrus
>> 
>> 
>>> On Sep 26, 2025, at 12:54 PM, Ricardo Parada <[email protected]> 
>>> wrote:
>>> 
>>> Thank you Andrus,
>>> 
>>> How would I do a query to fetch all where absDelta > 10 for example?
>>> 
>>> 
>>> 
>>>> On Sep 26, 2025, at 12:16 PM, Andrus Adamchik <[email protected]> wrote:
>>>> 
>>>> Hi Ricardo,
>>>> 
>>>> "defaultValueExpression" is a hallucination. There's nothing like that in 
>>>> Cayenne :) Taking it out of the model and into Java will work:
>>>> 
>>>> 1. A getter (like you mentioned) :
>>>> 
>>>> public BigDecimal getAbsDelta() {
>>>>  return getDelta().abs();
>>>> }
>>>> 
>>>> 2. An expression for WHERE:
>>>> 
>>>> Expression e = FunctionExpressionFactory.absExp("delta");
>>>> 
>>>> 3. An ordering:
>>>> 
>>>> Ordering o = new Ordering(e);
>>>> 
>>>> Thanks,
>>>> Andrus
>>>> 
>>>> 
>>>> 
>>>>> On Sep 26, 2025, at 10:48 AM, Ricardo Parada <[email protected]> 
>>>>> wrote:
>>>>> 
>>>>> 
>>>>> Hello,
>>>>> 
>>>>> I’m looking into what we should do with derived attributes we have 
>>>>> defined in our EOF object models after migrating to Cayenne. 
>>>>> 
>>>>> I would like to be able to use the derived attribute in queries in the 
>>>>> where clause and order by clause. 
>>>>> 
>>>>> For example, if my entity has a DELTA column and a derived column 
>>>>> ABS_DELTA that uses ABS(DELTA) expression when fetching it or when used 
>>>>> in the where clause or order by clause. 
>>>>> 
>>>>> ChatGPT suggested using defaultValueExpression as one of the options but 
>>>>> cautioned it would not work with 5.0-M1. Something like this:
>>>>> 
>>>>> <db-entity name="MY_ENTITY" schema="public">
>>>>> <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" 
>>>>> isMandatory="true"/>
>>>>> <db-attribute name="DELTA" type="DECIMAL"/>
>>>>> <db-attribute name="ABS_DELTA" type="DECIMAL" isGenerated="true">
>>>>>   <defaultValueExpression>ABS(DELTA)</defaultValueExpression>
>>>>> </db-attribute>
>>>>> </db-entity>
>>>>> 
>>>>> <obj-entity name="MyEntity" className="com.example.model.MyEntity" 
>>>>> dbEntityName="MY_ENTITY">
>>>>> <obj-attribute name="id" type="java.lang.Integer" db-attribute-path="ID"/>
>>>>> <obj-attribute name="delta" type="java.math.BigDecimal" 
>>>>> db-attribute-path="DELTA"/>
>>>>> <obj-attribute name="absDelta" type="java.math.BigDecimal" 
>>>>> db-attribute-path="ABS_DELTA"/>
>>>>> </obj-entity>
>>>>> 
>>>>> It also mentioned using something like this:
>>>>> 
>>>>> 
>>>>> Property.create("absDelta", BigDecimal.class).alias("ABS(DELTA)").
>>>>> Does anybody have any suggestions or recommendations? I would prefer 
>>>>> something that works with 5.0-M1 since by the time we do this migration 
>>>>> I’m thinking we would use the latest version which will be 5.0 by that 
>>>>> time.  
>>>>> 
>>>>> I think that something that allows me to use the derived columns in the 
>>>>> where and order by clause. In most cases it would be okay to additionally 
>>>>> write the logic in Java so that in-memory sorting / filtering works. For 
>>>>> example, a getAbsDelta() that returns Math.abs(getDelta()). 
>>>>> 
>>>>> 
>>>>> 
>>>>> Thank you
>>>>> 
>>>>> Ricardo Parada
>>>> 
>>> 
>> 
> 

Reply via email to