From 235ef3648ced980642a402cdedd0eef8cb1da5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Wed, 16 Nov 2011 13:53:55 +0200 Subject: [PATCH] small improvement in projection handling --- .../mysema/query/sql/AbstractSQLQuery.java | 51 +++++++++++-------- .../java/com/mysema/query/SelectBaseTest.java | 11 ++++ 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java index 25e5e5d66..3cc13b240 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java @@ -363,36 +363,22 @@ public abstract class AbstractSQLQuery> extends return configuration; } + @SuppressWarnings("unchecked") @Override public CloseableIterator iterate(Expression[] args) { + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof RelationalPath) { + args[i] = wrap((RelationalPath)args[i]); + } + } queryMixin.addToProjection(args); return iterateMultiple(queryMixin.getMetadata()); } - @SuppressWarnings("unchecked") @Override public CloseableIterator iterate(Expression expr) { if (expr instanceof RelationalPath) { - try{ - if (expr.getType().equals(expr.getClass())) { - throw new IllegalArgumentException("RelationalPath based projection can only be used with generated Bean types"); - } - Map> bindings = new HashMap>(); - for (Field field : expr.getClass().getDeclaredFields()) { - if (Expression.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())) { - field.setAccessible(true); - Expression column = (Expression) field.get(expr); - bindings.put(field.getName(), column); - } - } - if (bindings.isEmpty()) { - throw new IllegalArgumentException("No bindings could be derived from " + expr); - } - QBean bean = new QBean(expr.getType(), bindings); - return iterate(bean); - }catch(IllegalAccessException e) { - throw new QueryException(e); - } + return iterate(wrap((RelationalPath)expr)); } else { expr = queryMixin.convert(expr); queryMixin.addToProjection(expr); @@ -400,6 +386,29 @@ public abstract class AbstractSQLQuery> extends } } + @SuppressWarnings("unchecked") + protected QBean wrap(RelationalPath expr) { + try{ + if (expr.getType().equals(expr.getClass())) { + throw new IllegalArgumentException("RelationalPath based projection can only be used with generated Bean types"); + } + Map> bindings = new HashMap>(); + for (Field field : expr.getClass().getDeclaredFields()) { + if (Expression.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())) { + field.setAccessible(true); + Expression column = (Expression) field.get(expr); + bindings.put(field.getName(), column); + } + } + if (bindings.isEmpty()) { + throw new IllegalArgumentException("No bindings could be derived from " + expr); + } + return new QBean((Class)expr.getType(), bindings); + }catch(IllegalAccessException e) { + throw new QueryException(e); + } + } + private CloseableIterator iterateMultiple(QueryMetadata metadata) { String queryString = buildQueryString(false); logger.debug("query : {}", queryString); diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java index 0178618cf..37b6fe0e1 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java @@ -144,6 +144,17 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ assertNotNull(result[0]); } } + + @Test + public void RelationalPath_Projection() { + List results = query().from(employee, employee2).where(employee.id.eq(employee2.id)).list(employee, employee2); + assertFalse(results.isEmpty()); + for (Object[] row : results) { + Employee e1 = (Employee)row[0]; + Employee e2 = (Employee)row[1]; + assertEquals(e1.getId(), e2.getId()); + } + } @Test public void Beans(){