Re: Derived attribute

Andrus Adamchik <[email protected]> Mon, 29 Sep 2025 14:43:22 -0400
Newsgroups gmane.comp.java.cayenne.user
Message-ID <[email protected]>
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 =3D MyEntity.DELTA.abs().gt(10)

Should've thought of that before :)

Andrus


> On Sep 26, 2025, at 12:54=E2=80=AFPM, Ricardo Parada =
<[email protected]> wrote:
>=20
> Thank you Andrus,
>=20
> How would I do a query to fetch all where absDelta > 10 for example?
>=20
>=20
>=20
>> On Sep 26, 2025, at 12:16=E2=80=AFPM, Andrus Adamchik =
<[email protected]> wrote:
>>=20
>> Hi Ricardo,
>>=20
>> "defaultValueExpression" is a hallucination. There's nothing like =
that in Cayenne :) Taking it out of the model and into Java will work:
>>=20
>> 1. A getter (like you mentioned) :
>>=20
>>  public BigDecimal getAbsDelta() {
>>     return getDelta().abs();
>>  }
>>=20
>> 2. An expression for WHERE:
>>=20
>>  Expression e =3D FunctionExpressionFactory.absExp("delta");
>>=20
>> 3. An ordering:
>>=20
>>  Ordering o =3D new Ordering(e);
>>=20
>> Thanks,
>> Andrus
>>=20
>>=20
>>=20
>>> On Sep 26, 2025, at 10:48=E2=80=AFAM, Ricardo Parada =
<[email protected]> wrote:
>>>=20
>>>=20
>>> Hello,
>>>=20
>>> I=E2=80=99m looking into what we should do with derived attributes =
we have defined in our EOF object models after migrating to Cayenne.=20
>>>=20
>>> I would like to be able to use the derived attribute in queries in =
the where clause and order by clause.=20
>>>=20
>>> 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.=20
>>>=20
>>> ChatGPT suggested using defaultValueExpression as one of the options =
but cautioned it would not work with 5.0-M1. Something like this:
>>>=20
>>> <db-entity name=3D"MY_ENTITY" schema=3D"public">
>>>  <db-attribute name=3D"ID" type=3D"INTEGER" isPrimaryKey=3D"true" =
isMandatory=3D"true"/>
>>>  <db-attribute name=3D"DELTA" type=3D"DECIMAL"/>
>>>  <db-attribute name=3D"ABS_DELTA" type=3D"DECIMAL" =
isGenerated=3D"true">
>>>      <defaultValueExpression>ABS(DELTA)</defaultValueExpression>
>>>  </db-attribute>
>>> </db-entity>
>>>=20
>>> <obj-entity name=3D"MyEntity" className=3D"com.example.model.MyEntity"=
 dbEntityName=3D"MY_ENTITY">
>>>  <obj-attribute name=3D"id" type=3D"java.lang.Integer" =
db-attribute-path=3D"ID"/>
>>>  <obj-attribute name=3D"delta" type=3D"java.math.BigDecimal" =
db-attribute-path=3D"DELTA"/>
>>>  <obj-attribute name=3D"absDelta" type=3D"java.math.BigDecimal" =
db-attribute-path=3D"ABS_DELTA"/>
>>> </obj-entity>
>>>=20
>>> It also mentioned using something like this:
>>>=20
>>>=20
>>> 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=E2=80=99m thinking we would use the latest version which will be 5.0 =
by that time. =20
>>>=20
>>> 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()).=20
>>>=20
>>>=20
>>>=20
>>> Thank you
>>>=20
>>> Ricardo Parada
>>=20
>=20