We already have map(Function) method available in both ColumnSelect and SQLSelect that allows to map result from Object[] to anything via provided function. Here is an example from tests [1]:
List<ArtistDataWrapper> result = SQLSelect.columnQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class, LocalDateTime.class) .map(ArtistDataWrapper::new) .select(context); And I experimented with simple PojoMapper that does almost exactly what you are suggesting. Not sure if it's available though. [1] https://github.com/apache/cayenne/blob/336f0e5297fe6ccdc3b1904ab4f6ee2c6d1ab9dc/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java#L273 On Thu, Jul 14, 2022 at 10:52 PM Andrus Adamchik <aadamc...@gmail.com> wrote: > > Java 17 "records" create some interesting possibilities as quick DTOs. > Mapping complex SQL is still rather painful in Cayenne. You'd get an Object[] > as a result and/or need complex scripting within SQL. I think records and > some API tweaks can help: > > 1. SQL result mapping. > > record MyRecord(String lastName, String firstName) {} // non-persistent, not > in DataMap > > SQLSelect.query("select * from x") > > // new API analogous to "#result" directive but simpler to use > // also we can implement some implicit name conversions ("AB_C" -> "abC") > .resultColumn(0, "firstName") > .resultColumn("LAST_NAME", "lastName") > > // new API - auto-mapping the result to a POJO (record in this case) > .selectAs(MyRecord.class, context); > > > 2. Entity result mapping (e.g. a replacement of column and data row queries). > > class MyEntity extends _MyEntity {} // Persistent > record MyEntityDTO(..) {} // non-persistent, not in DataMap > > List<MyEntityDTO> result = ObjectSelect(MyEntity.class) > .where(MyEntity.NAME.like("Joe")) > .prefetch(MyEntity.ANOTHER.joint()) > > // new API - auto-mapping the result to a POJO (record in this case) > .selectAs(MyEntityDTO.class, context); > > It will be faster than fetching MyEntity (without ObjectContext registration, > uniquing, merging), and will be a good replacement of column queries API, > requiring no explicit column declarations, and producing a specific type > instead of Object[]. Prefetches can be auto-mapped to record hierarchies. > > Both examples would work with either records or regular POJOs, it is just > that record definitions are so easy to create on the spot, that they can be > used in a multitude of very narrow contexts. > > Andrus > -- Best regards, Nikita Timofeev