This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit d3856d212d7c050c4185ede7ad0e7add56923fd8 Author: Nikita Timofeev <stari...@gmail.com> AuthorDate: Wed Aug 7 17:04:23 2019 +0300 CAY-2527 API to map Object[] result to POJO - combine multiple mappers --- .../apache/cayenne/query/ColumnSelectMetadata.java | 7 +++++- .../apache/cayenne/query/SQLTemplateMetadata.java | 6 ++++- .../org/apache/cayenne/query/ColumnSelectIT.java | 26 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java index 2ab406e..1222346 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java @@ -136,8 +136,13 @@ class ColumnSelectMetadata extends ObjectSelectMetadata { this.suppressingDistinct = suppressingDistinct; } + @SuppressWarnings("unchecked") void setResultMapper(Function<?, ?> resultMapper) { - this.resultMapper = resultMapper; + if(this.resultMapper != null) { + this.resultMapper = this.resultMapper.andThen((Function)resultMapper); + } else { + this.resultMapper = resultMapper; + } } @Override diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java index 6bd92ed..99910ca 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java @@ -129,7 +129,11 @@ public class SQLTemplateMetadata extends BaseQueryMetadata { } void setResultMapper(Function<?,?> resultMapper) { - this.resultMapper = resultMapper; + if(this.resultMapper != null) { + this.resultMapper = this.resultMapper.andThen((Function)resultMapper); + } else { + this.resultMapper = resultMapper; + } } @Override diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java index 6ec41fb..5220e7b 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java @@ -1178,6 +1178,25 @@ public class ColumnSelectIT extends ServerCase { assertNotNull(testPojo19.date); } + @Test + public void testDoubleMapToPojo() { + List<TestPojo2> result = ObjectSelect.query(Artist.class) + .columns(Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.ARTIST_NAME.trim().length()) + .where(Artist.ARTIST_NAME.like("artist%")) + .orderBy(Artist.ARTIST_ID_PK_PROPERTY.asc()) + .map(TestPojo::new) + .map(TestPojo2::new) + .select(context); + assertEquals(20, result.size()); + + TestPojo2 testPojo0 = result.get(0); + assertNotNull(testPojo0); + assertEquals("artist1", testPojo0.pojo.name); + assertNotNull(testPojo0.pojo.date); + assertEquals(7, testPojo0.pojo.length); + + } + static class TestPojo { String name; Date date; @@ -1188,4 +1207,11 @@ public class ColumnSelectIT extends ServerCase { length = (Integer)data[2]; } } + + static class TestPojo2 { + TestPojo pojo; + TestPojo2(TestPojo pojo) { + this.pojo = pojo; + } + } }