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