From 27979f07905dbf95b478a48babc99643d71bfdec Mon Sep 17 00:00:00 2001 From: James Moger Date: Mon, 4 Apr 2016 19:17:43 -0400 Subject: Allow selecting a column from a table --- src/main/java/com/iciql/Db.java | 4 ++++ src/main/java/com/iciql/Query.java | 45 +++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 5 deletions(-) (limited to 'src/main/java/com') diff --git a/src/main/java/com/iciql/Db.java b/src/main/java/com/iciql/Db.java index 088fc30..d0756bc 100644 --- a/src/main/java/com/iciql/Db.java +++ b/src/main/java/com/iciql/Db.java @@ -140,6 +140,10 @@ public class Db implements AutoCloseable { return x; } + static boolean isToken(X x) { + return TOKENS.containsKey(x); + } + static Token getToken(Object x) { return TOKENS.get(x); } diff --git a/src/main/java/com/iciql/Query.java b/src/main/java/com/iciql/Query.java index 1dbbc4e..f8fd4ca 100644 --- a/src/main/java/com/iciql/Query.java +++ b/src/main/java/com/iciql/Query.java @@ -389,9 +389,21 @@ public class Query { @SuppressWarnings("unchecked") private List select(Z x, boolean distinct) { Class clazz = x.getClass(); - if (Utils.isSimpleType(clazz)) { - return selectSimple((X) x, distinct); + if (Db.isToken(x)) { + // selecting a function + return selectFunction((X) x, distinct); + } else { + // selecting a column + SelectColumn col = getColumnByReference(x); + if (col == null) { + col = getColumnByReference(getPrimitiveAliasByValue(x)); + } + if (col != null) { + return (List) selectColumn(col, clazz, distinct); + } } + + // selecting into a new object type Class enclosingClass = clazz.getEnclosingClass(); if (enclosingClass != null) { // anonymous inner class @@ -426,18 +438,41 @@ public class Query { } @SuppressWarnings("unchecked") - private List selectSimple(X x, boolean distinct) { + private List selectFunction(X x, boolean distinct) { SQLStatement stat = getSelectStatement(distinct); appendSQL(stat, null, x); appendFromWhere(stat); ResultSet rs = stat.executeQuery(); List result = Utils.newArrayList(); - Class> typeAdapter = Utils.getDataTypeAdapter(x.getClass().getAnnotations()); try { // SQLite returns pre-closed ResultSets for query results with 0 rows if (!rs.isClosed()) { while (rs.next()) { - X value = (X) db.getDialect().deserialize(rs, 1, x.getClass(), typeAdapter); + X value = (X) rs.getObject(1); + result.add(value); + } + } + } catch (Exception e) { + throw IciqlException.fromSQL(stat.getSQL(), e); + } finally { + JdbcUtils.closeSilently(rs, true); + } + return result; + } + + @SuppressWarnings("unchecked") + private List selectColumn(SelectColumn col, Class clazz, boolean distinct) { + SQLStatement stat = getSelectStatement(distinct); + col.appendSQL(stat); + appendFromWhere(stat); + ResultSet rs = stat.executeQuery(); + List result = Utils.newArrayList(); + Class> typeAdapter = col.getFieldDefinition().typeAdapter; + try { + // SQLite returns pre-closed ResultSets for query results with 0 rows + if (!rs.isClosed()) { + while (rs.next()) { + X value = (X) db.getDialect().deserialize(rs, 1, clazz, typeAdapter); result.add(value); } } -- cgit v1.2.3