aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/com
diff options
context:
space:
mode:
authorJames Moger <james.moger@gitblit.com>2016-04-04 19:17:43 -0400
committerJames Moger <james.moger@gitblit.com>2016-04-04 19:17:43 -0400
commit27979f07905dbf95b478a48babc99643d71bfdec (patch)
tree9c5cc0c9f72d30d0cf6747cc62b3452fa8020c37 /src/main/java/com
parent13b08bb1e5a955650289c1c2d548883bfeac0de9 (diff)
downloadiciql-27979f07905dbf95b478a48babc99643d71bfdec.tar.gz
iciql-27979f07905dbf95b478a48babc99643d71bfdec.zip
Allow selecting a column from a table
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/iciql/Db.java4
-rw-r--r--src/main/java/com/iciql/Query.java45
2 files changed, 44 insertions, 5 deletions
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 <X> 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<T> {
@SuppressWarnings("unchecked")
private <X, Z> List<X> 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<T> col = getColumnByReference(x);
+ if (col == null) {
+ col = getColumnByReference(getPrimitiveAliasByValue(x));
+ }
+ if (col != null) {
+ return (List<X>) 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<T> {
}
@SuppressWarnings("unchecked")
- private <X> List<X> selectSimple(X x, boolean distinct) {
+ private <X> List<X> selectFunction(X x, boolean distinct) {
SQLStatement stat = getSelectStatement(distinct);
appendSQL(stat, null, x);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
List<X> result = Utils.newArrayList();
- Class<? extends DataTypeAdapter<?>> 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 <X> List<X> selectColumn(SelectColumn<T> col, Class<X> clazz, boolean distinct) {
+ SQLStatement stat = getSelectStatement(distinct);
+ col.appendSQL(stat);
+ appendFromWhere(stat);
+ ResultSet rs = stat.executeQuery();
+ List<X> result = Utils.newArrayList();
+ Class<? extends DataTypeAdapter<?>> 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);
}
}