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