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 >>> >> >
