From 3878b02cffa50cead52f43a2c60be0908e3f34bb Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Sat, 22 Feb 2020 10:50:23 +1300 Subject: [PATCH] #1956 - Add SqlQuery - mapTo( RowMapper) ... to deprecate findOne(RowMapper) --- src/main/java/io/ebean/RowMapper.java | 5 +- src/main/java/io/ebean/SqlQuery.java | 47 ++++++++----------- .../querydefn/DefaultRelationalQuery.java | 41 +++++++++++++++- .../tests/query/sqlquery/SqlQueryTests.java | 9 ++-- 4 files changed, 68 insertions(+), 34 deletions(-) diff --git a/src/main/java/io/ebean/RowMapper.java b/src/main/java/io/ebean/RowMapper.java index 5ef6e64de..b1d59c984 100644 --- a/src/main/java/io/ebean/RowMapper.java +++ b/src/main/java/io/ebean/RowMapper.java @@ -18,7 +18,7 @@ import java.sql.SQLException; *
{@code
  *
  *    //
- *    // A mapper from ResultSet into our CustomerDto bean
+ *    // Map from ResultSet to CustomerDto bean
  *    //
  *    class CustomerMapper implements RowMapper {
  *
@@ -42,7 +42,8 @@ import java.sql.SQLException;
  *
  *  CustomerDto rob = DB.sqlQuery(sql)
  *    .setParameter(1, "Rob")
- *    .findOne(CUSTOMER_MAPPER);
+ *    .mapTo(CUSTOMER_MAPPER)
+ *    .findOne();
  *
  *
  * }
diff --git a/src/main/java/io/ebean/SqlQuery.java b/src/main/java/io/ebean/SqlQuery.java index 634538610..be477ef96 100644 --- a/src/main/java/io/ebean/SqlQuery.java +++ b/src/main/java/io/ebean/SqlQuery.java @@ -75,17 +75,15 @@ public interface SqlQuery extends Serializable { SqlRow findOne(); /** - * Execute the query returning a single result using the mapper. - * - * @param mapper Used to map each ResultSet row into the result object. + * Deprecated migrate to use {@link #mapTo(RowMapper)} */ + @Deprecated T findOne(RowMapper mapper); /** - * Execute the query returning a list using the mapper. - * - * @param mapper Used to map each ResultSet row into the result object. + * Deprecated migrate to use {@link #mapTo(RowMapper)} */ + @Deprecated List findList(RowMapper mapper); /** @@ -158,28 +156,14 @@ public interface SqlQuery extends Serializable { Long findSingleLong(); /** - * Execute the query returning a list of scalar attribute values. - * + * Deprecated - migrate to .mapToScalar(Long.class).findList(). *
{@code
    *
-   *   String sql =
-   *   " select (unit_price * order_qty) " +
-   *   " from o_order_detail " +
-   *   " where unit_price > ? " +
-   *   " order by (unit_price * order_qty) desc";
-   *
-   *   List lineAmounts =
-   *     DB.sqlQuery(sql)
-   *       .setParameter(42)
-   *       .findSingleAttributeList(BigDecimal.class);
-   *
-   * }
- * - *

- * The attributeType can be any scalar type that Ebean supports (includes javax time types, Joda types etc). - * - * @param attributeType The type of the returned value + * .mapToScalar(Long.class) + * .findList(); + * } */ + @Deprecated List findSingleAttributeList(Class attributeType); /** @@ -312,14 +296,23 @@ public interface SqlQuery extends Serializable { * @param attributeType The type the result is returned as * @return The query to execute via findOne() findList() etc */ - ScalarQuery mapToScalar(Class attributeType); + TypeQuery mapToScalar(Class attributeType); + + /** + * Use a RowMapper to map the result to beans. + * + * @param mapper Maps rows to beans + * @param The type of beans mapped to + * @return The query to execute by findOne() findList() etc + */ + TypeQuery mapTo(RowMapper mapper); /** * Query mapping to single scalar values. * * @param The type of the scalar values */ - interface ScalarQuery { + interface TypeQuery { /** * Return the single value. diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index aa29bce24..ec5b3c01a 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -208,12 +208,25 @@ public class DefaultRelationalQuery implements SpiSqlQuery { return query; } + T mapperFindOne(RowMapper mapper) { + return server.findOneMapper(this, mapper); + } + + List mapperFindList(RowMapper mapper) { + return server.findListMapper(this, mapper); + } + @Override - public ScalarQuery mapToScalar(Class attributeType) { + public TypeQuery mapToScalar(Class attributeType) { return new Scalar(attributeType); } - private class Scalar implements SqlQuery.ScalarQuery { + @Override + public TypeQuery mapTo(RowMapper mapper) { + return new Mapper(mapper); + } + + private class Scalar implements SqlQuery.TypeQuery { private final Class type; @@ -236,4 +249,28 @@ public class DefaultRelationalQuery implements SpiSqlQuery { return findSingleAttributeList(type); } } + + private class Mapper implements SqlQuery.TypeQuery { + + private final RowMapper mapper; + + Mapper(RowMapper mapper) { + this.mapper = mapper; + } + + @Override + public T findOne() { + return mapperFindOne(mapper); + } + + @Override + public Optional findOneOrEmpty() { + return Optional.ofNullable(findOne()); + } + + @Override + public List findList() { + return mapperFindList(mapper); + } + } } diff --git a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java index 308e350ff..c79f07d21 100644 --- a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java +++ b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java @@ -151,7 +151,8 @@ public class SqlQueryTests extends BaseTestCase { CustDto rob = DB.sqlQuery(sql) .setParameter("Rob") - .findOne(CUST_MAPPER); + .mapTo(CUST_MAPPER) + .findOne(); assertThat(rob.name).isEqualTo("Rob"); } @@ -164,7 +165,8 @@ public class SqlQueryTests extends BaseTestCase { String sql = "select id, name, status from o_customer order by name desc"; List dtos = DB.sqlQuery(sql) - .findList(CUST_MAPPER); + .mapTo(CUST_MAPPER) + .findList(); assertThat(dtos).isNotEmpty(); } @@ -200,7 +202,8 @@ public class SqlQueryTests extends BaseTestCase { long maxId = DB.sqlQuery(sql) .setParameter("Rob") - .findOne((resultSet, rowNum) -> resultSet.getLong(1)); + .mapTo((resultSet, rowNum) -> resultSet.getLong(1)) + .findOne(); assertThat(maxId).isGreaterThan(0); }