Re: Derived attribute

Ricardo Parada <[email protected]> Tue, 30 Sep 2025 18:40:23 -0400
Newsgroups gmane.comp.java.cayenne.user
Message-ID <[email protected]>
I tested it as follows:

Expression e =3D FunctionExpressionFactory.lowerExp("name=E2=80=9D);

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


> On Sep 30, 2025, at 5:42=E2=80=AFPM, Ricardo Parada <[email protected]> =
wrote:
>=20
> Thank you Andrus,
>=20
> I had figured it out.  I=E2=80=99m finding the API easier to work with =
than EOF.
>=20
> I like that these expressions can then be used with =
ObjectSelect.columnQuery() etc. and I don=E2=80=99t have to attach them =
to the entities like we did with EOF using derived attributes.
>=20
> Regards,
> Ricardo
>=20
>=20
>=20
>> On Sep 29, 2025, at 2:43=E2=80=AFPM, Andrus Adamchik =
<[email protected]> wrote:
>>=20
>> 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:
>>=20
>> Expression e =3D MyEntity.DELTA.abs().gt(10)
>>=20
>> Should've thought of that before :)
>>=20
>> Andrus
>>=20
>>=20
>>> 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
>>=20
>=20