From c95aa4cb7b2d9287c587efee167000234022a16f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 11 Jul 2012 22:17:52 +0200 Subject: [PATCH] [#1552] Generate fetchBy[ColumnName] methods in generated DAO classes --- .../java/org/jooq/util/DefaultGenerator.java | 51 +++++++++++++++++++ .../org/jooq/test/_/testcases/DaoTests.java | 15 ++++++ jOOQ/src/main/java/org/jooq/DAO.java | 25 +++++++++ jOOQ/src/main/java/org/jooq/impl/DAOImpl.java | 16 ++++++ 4 files changed, 107 insertions(+) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java index de909d84f5..a05376086c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java @@ -1289,6 +1289,57 @@ public class DefaultGenerator extends AbstractGenerator { out.println("();"); out.println("\t}"); + for (ColumnDefinition column : table.getColumns()) { + + // fetchBy[Column]([T]...) + // ----------------------- + out.println(); + printJavadoc(out, "Fetch records that have " + column.getOutputName() + " IN (values)"); + out.print("\tpublic "); + out.print(List.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.POJO)); + out.print("> fetchBy"); + out.print(strategy.getJavaClassName(column, Mode.POJO)); + out.print("("); + out.print(getJavaType(column.getType())); + out.println("... values) {"); + + out.print("\t\treturn fetch("); + out.print(strategy.getFullJavaIdentifier(column)); + out.println(", values);"); + + out.println("\t}"); + + // fetchOneBy[Column]([T]) + // ----------------------- + ukLoop: + for (UniqueKeyDefinition uk : column.getUniqueKeys()) { + + // If column is part of a single-column unique key... + if (uk.getKeyColumns().size() == 1 && uk.getKeyColumns().get(0).equals(column)) { + + out.println(); + printJavadoc(out, "Fetch a unique that has " + column.getOutputName() + " = value"); + out.print("\tpublic "); + out.print(strategy.getFullJavaClassName(table, Mode.POJO)); + out.print(" fetchOneBy"); + out.print(strategy.getJavaClassName(column, Mode.POJO)); + out.print("("); + out.print(getJavaType(column.getType())); + out.println(" value) {"); + + out.print("\t\treturn fetchOne("); + out.print(strategy.getFullJavaIdentifier(column)); + out.println(", value);"); + + out.println("\t}"); + + break ukLoop; + } + } + } + out.println("}"); out.close(); } diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/DaoTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/DaoTests.java index 1ce2ff0e1e..82d262128b 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/DaoTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/DaoTests.java @@ -101,6 +101,21 @@ extends BaseTest authors1 = on(TAuthorDao()).call("fetchByLastName", (Object) new String[] { "Orwell", "George"}).>get(); + assertEquals(1, authors1.size()); + assertEquals(1, on(authors1.get(0)).get("id")); + assertEquals("George", on(authors1.get(0)).get("firstName")); + assertEquals("Orwell", on(authors1.get(0)).get("lastName")); + + List authors2 = on(TAuthorDao()).call("fetchByLastName", (Object) new String[] { "Orwell", "Coelho"}).>get(); + assertEquals(2, authors2.size()); + assertEquals(1, on(authors2.get(0)).get("id")); + assertEquals("George", on(authors2.get(0)).get("firstName")); + assertEquals("Orwell", on(authors2.get(0)).get("lastName")); + assertEquals(2, on(authors2.get(1)).get("id")); + assertEquals("Paulo", on(authors2.get(1)).get("firstName")); + assertEquals("Coelho", on(authors2.get(1)).get("lastName")); + // Single insertion // ---------------- AP author = diff --git a/jOOQ/src/main/java/org/jooq/DAO.java b/jOOQ/src/main/java/org/jooq/DAO.java index 58b8a38e5c..e176641671 100644 --- a/jOOQ/src/main/java/org/jooq/DAO.java +++ b/jOOQ/src/main/java/org/jooq/DAO.java @@ -185,6 +185,31 @@ public interface DAO, P, T> { */ P findById(T id) throws DataAccessException; + /** + * Find records by a given field and a set of values. + * + * @param field The field to compare values against + * @param values The accepted values + * @return A list of records fulfilling field IN (values) + * @throws DataAccessException if something went wrong executing the query + */ + List

fetch(Field field, Z... values) throws DataAccessException; + + /** + * Find a unique record by a given field and a value. + * + * @param field The field to compare value against + * @param value The accepted value + * @return A record fulfilling field = value, or + * null + * @throws DataAccessException This exception is thrown + *

    + *
  • if something went wrong executing the query
  • + *
  • if the query returned more than one value
  • + *
+ */ + P fetchOne(Field field, Z value) throws DataAccessException; + /** * Get the underlying table */ diff --git a/jOOQ/src/main/java/org/jooq/impl/DAOImpl.java b/jOOQ/src/main/java/org/jooq/impl/DAOImpl.java index 7cbd2996a7..23efb826a9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DAOImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DAOImpl.java @@ -212,6 +212,22 @@ public abstract class DAOImpl, P, T> implements DAO return record == null ? null : record.into(type); } + @Override + public final List

fetch(Field field, Z... values) { + return create.selectFrom(table) + .where(field.in(values)) + .fetch() + .into(type); + } + + @Override + public final P fetchOne(Field field, Z value) { + return create.selectFrom(table) + .where(field.equal(value)) + .fetchOne() + .into(type); + } + @Override public final Table getTable() { return table;