From cbdf5609b23a267028e0f57614495ccce030d57b Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 27 May 2020 22:05:39 +1200 Subject: [PATCH] #2015 - Dto instance id fields are not populated when queried using DtoQuery (and no select clause is specified) --- .../java/io/ebeaninternal/api/SpiQuery.java | 2 +- .../server/core/DtoQueryRequest.java | 2 +- .../server/querydefn/DefaultOrmQuery.java | 6 +- .../java/io/ebean/DtoQueryFromOrmTest.java | 66 +++++++++++++++++++ .../server/querydefn/OrmQueryPlanKeyTest.java | 13 +++- 5 files changed, 82 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/ebeaninternal/api/SpiQuery.java b/src/main/java/io/ebeaninternal/api/SpiQuery.java index 496bb6d30..b11c44745 100644 --- a/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -788,7 +788,7 @@ public interface SpiQuery extends Query, TxnProfileEventCodes { /** * Set to true when we only include the Id property if it is explicitly included in the select(). */ - void setManualId(boolean manualId); + void setManualId(); /** * Set default select clauses where none have been explicitly defined. diff --git a/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java index c217f7a9f..44a095e81 100644 --- a/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java @@ -47,7 +47,7 @@ public final class DtoQueryRequest extends AbstractSqlQueryRequest { SpiQuery ormQuery = query.getOrmQuery(); if (ormQuery != null) { ormQuery.setType(type); - ormQuery.setManualId(true); + ormQuery.setManualId(); // execute the underlying ORM query returning the ResultSet SpiResultSet result = server.findResultSet(ormQuery, trans); diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index c908ece64..de23eb3c5 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -1715,8 +1715,10 @@ public class DefaultOrmQuery implements SpiQuery { } @Override - public void setManualId(boolean manualId) { - this.manualId = manualId; + public void setManualId() { + if (detail != null && detail.hasSelectClause()) { + this.manualId = true; + } } /** diff --git a/src/test/java/io/ebean/DtoQueryFromOrmTest.java b/src/test/java/io/ebean/DtoQueryFromOrmTest.java index 9ad7722bb..ee26e9409 100644 --- a/src/test/java/io/ebean/DtoQueryFromOrmTest.java +++ b/src/test/java/io/ebean/DtoQueryFromOrmTest.java @@ -140,6 +140,32 @@ public class DtoQueryFromOrmTest extends BaseTestCase { + " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name"); } + @Test + public void asDto_withoutSelectClause() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + DtoQuery query = DB.find(Contact.class) + .where().isNotNull("email").order().asc("lastName") + .asDto(ContactDto2.class) + .setRelaxedMode(); + + List dtos = query.findList(); + assertThat(dtos).isNotEmpty(); + + for (ContactDto2 dto : dtos) { + assertThat(dto.getEmail()).isNotNull(); + assertThat(dto.getFirstName()).isNotNull(); + assertThat(dto.getLastName()).isNotNull(); + assertThat(dto.getId()).isGreaterThan(0); + } + + List sql = LoggedSqlCollector.stop(); + assertSql(sql.get(0)).contains("select t0.id, t0.first_name, t0.last_name"); + } + @Test public void asDto_withoutExplicitId() { @@ -326,6 +352,46 @@ public class DtoQueryFromOrmTest extends BaseTestCase { } } + public static class ContactDto2 { + + int id; + String firstName; + String lastName; + String email; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + } + public static class ContactDto { String email; diff --git a/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java b/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java index 4cffd3e61..0c2f07e98 100644 --- a/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java +++ b/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java @@ -308,12 +308,19 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { } @Test - public void equals_when_manualId() { + public void equals_when_manualId_andSelectClause() { + DefaultOrmQuery q1 = query().select("name"); + q1.setManualId(); + assertDifferent(q1, query().select("name")); + } + + @Test + public void equals_when_manualId_andNoSelectClause() { DefaultOrmQuery q1 = query(); - q1.setManualId(true); + q1.setManualId(); - assertDifferent(q1, query()); + assertSame(q1, query()); } private CQueryPlanKey planKey(ExpressionList id) {