Re: Derived attribute

Andrus Adamchik <[email protected]> Wed, 1 Oct 2025 17:51:57 -0400
Newsgroups gmane.comp.java.cayenne.user
Message-ID <[email protected]>
Great! Yeah, column queries are quite handy.=20

> On Sep 30, 2025, at 6:40=E2=80=AFPM, Ricardo Parada =
<[email protected]> wrote:
>=20
> I tested it as follows:
>=20
> Expression e =3D FunctionExpressionFactory.lowerExp("name=E2=80=9D);
>=20
> 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);
>=20
>=20
>> 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
>=20