diff --git a/querydsl-core/src/main/java/com/mysema/query/support/DetachableMixin.java b/querydsl-core/src/main/java/com/mysema/query/support/DetachableMixin.java index 736326ab9..bf97369d2 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/DetachableMixin.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/DetachableMixin.java @@ -6,6 +6,7 @@ package com.mysema.query.support; import com.mysema.commons.lang.Assert; +import com.mysema.query.QueryMetadata; import com.mysema.query.types.Expr; import com.mysema.query.types.Ops; import com.mysema.query.types.expr.EBoolean; @@ -36,8 +37,7 @@ public class DetachableMixin implements Detachable{ @Override public ObjectSubQuery count() { - queryMixin.addToProjection(COUNT_ALL_AGG_EXPR); - return new ObjectSubQuery(Long.class, queryMixin.getMetadata()); + return new ObjectSubQuery(Long.class, projection(COUNT_ALL_AGG_EXPR)); } @Override @@ -50,22 +50,18 @@ public class DetachableMixin implements Detachable{ @Override public ListSubQuery list(Expr first, Expr second, Expr... rest) { - queryMixin.addToProjection(first, second); - queryMixin.addToProjection(rest); - return new ListSubQuery(Object[].class, queryMixin.getMetadata()); + return new ListSubQuery(Object[].class, projection(first, second, rest)); } @Override public ListSubQuery list(Expr[] args) { - queryMixin.addToProjection(args); - return new ListSubQuery(Object[].class, queryMixin.getMetadata()); + return new ListSubQuery(Object[].class, projection(args)); } @SuppressWarnings("unchecked") @Override public ListSubQuery list(Expr projection) { - queryMixin.addToProjection(projection); - return new ListSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new ListSubQuery((Class)projection.getType(), projection(projection)); } @Override @@ -73,77 +69,92 @@ public class DetachableMixin implements Detachable{ return exists().not(); } - private void setUniqueProjection(Expr projection){ - queryMixin.addToProjection(projection); - queryMixin.setUnique(true); - } - @Override public BooleanSubQuery unique(EBoolean projection) { - setUniqueProjection(projection); - return new BooleanSubQuery(queryMixin.getMetadata()); + return new BooleanSubQuery(uniqueProjection(projection)); } @SuppressWarnings("unchecked") @Override public > ComparableSubQuery unique(EComparable projection) { - setUniqueProjection(projection); - return new ComparableSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new ComparableSubQuery((Class)projection.getType(), uniqueProjection(projection)); } @SuppressWarnings("unchecked") @Override public > DateSubQuery unique(EDate projection) { - setUniqueProjection(projection); - return new DateSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new DateSubQuery((Class)projection.getType(), uniqueProjection(projection)); } @SuppressWarnings("unchecked") @Override public > DateTimeSubQuery unique(EDateTime projection) { - setUniqueProjection(projection); - return new DateTimeSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new DateTimeSubQuery((Class)projection.getType(), uniqueProjection(projection)); } @SuppressWarnings("unchecked") @Override public > NumberSubQuery unique(ENumber projection) { - setUniqueProjection(projection); - return new NumberSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new NumberSubQuery((Class)projection.getType(), uniqueProjection(projection)); } @Override public StringSubQuery unique(EString projection) { - setUniqueProjection(projection); - return new StringSubQuery(queryMixin.getMetadata()); + return new StringSubQuery(uniqueProjection(projection)); } @SuppressWarnings("unchecked") @Override public > TimeSubQuery unique(ETime projection) { - setUniqueProjection(projection); - return new TimeSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new TimeSubQuery((Class)projection.getType(), uniqueProjection(projection)); } @Override public ObjectSubQuery unique(Expr first, Expr second, Expr... rest) { - queryMixin.addToProjection(first, second); - queryMixin.addToProjection(rest); - queryMixin.setUnique(true); - return new ObjectSubQuery(Object[].class, queryMixin.getMetadata()); + return new ObjectSubQuery(Object[].class, uniqueProjection(first, second, rest)); } + @Override public ObjectSubQuery unique(Expr[] args) { - queryMixin.addToProjection(args); - queryMixin.setUnique(true); - return new ObjectSubQuery(Object[].class, queryMixin.getMetadata()); + return new ObjectSubQuery(Object[].class, uniqueProjection(args)); } @SuppressWarnings("unchecked") @Override public ObjectSubQuery unique(Expr projection) { - setUniqueProjection(projection); - return new ObjectSubQuery((Class)projection.getType(), queryMixin.getMetadata()); + return new ObjectSubQuery((Class)projection.getType(), uniqueProjection(projection)); } + + private QueryMetadata projection(Expr... projection){ + QueryMetadata metadata = queryMixin.getMetadata().clone(); + for (Expr expr : projection){ + metadata.addProjection(expr); + } + return metadata; + } + + private QueryMetadata projection(Expr first, Expr second, Expr[] rest) { + QueryMetadata metadata = queryMixin.getMetadata().clone(); + metadata.addProjection(first); + metadata.addProjection(second); + for (Expr expr : rest){ + metadata.addProjection(expr); + } + return metadata; + } + + private QueryMetadata uniqueProjection(Expr... projection){ + QueryMetadata metadata = projection(projection); + metadata.setUnique(true); + return metadata; + } + + + private QueryMetadata uniqueProjection(Expr first, Expr second, Expr[] rest) { + QueryMetadata metadata = projection(first, second, rest); + metadata.setUnique(true); + return metadata; + } + } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/Ops.java b/querydsl-core/src/main/java/com/mysema/query/types/Ops.java index 9558c94bf..7b76b7764 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/Ops.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/Ops.java @@ -142,7 +142,6 @@ public interface Ops { Operator COUNT_AGG = new OperatorImpl("COUNT_AGG",Object.class); Operator COUNT_DISTINCT_AGG = new OperatorImpl("COUNT_DISTINCT_AGG",Object.class); Operator COUNT_ALL_AGG = new OperatorImpl("COUNT_ALL_AGG"); -// ENumber COUNT_ALL_AGG_EXPR = ONumber.create(Long.class, COUNT_ALL_AGG); } /** diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/HQLSubQueryTest.java b/querydsl-hql/src/test/java/com/mysema/query/hql/HQLSubQueryTest.java new file mode 100644 index 000000000..7c04f63b2 --- /dev/null +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/HQLSubQueryTest.java @@ -0,0 +1,19 @@ +package com.mysema.query.hql; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.mysema.query.hql.domain.QCat; + +public class HQLSubQueryTest { + + @Test + public void Multiple_Projections(){ + HQLSubQuery query = new HQLSubQuery(); + query.from(QCat.cat); + assertEquals(1, query.list(QCat.cat).getMetadata().getProjection().size()); + assertEquals(1, query.list(QCat.cat).getMetadata().getProjection().size()); + } + +} diff --git a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/JDOQLSubQueryTest.java b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/JDOQLSubQueryTest.java new file mode 100644 index 000000000..960eb61c5 --- /dev/null +++ b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/JDOQLSubQueryTest.java @@ -0,0 +1,19 @@ +package com.mysema.query.jdoql; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.mysema.query.jdoql.testdomain.QProduct; + +public class JDOQLSubQueryTest { + + @Test + public void Multiple_Projections(){ + JDOQLSubQuery query = new JDOQLSubQuery(); + query.from(QProduct.product); + assertEquals(1, query.list(QProduct.product).getMetadata().getProjection().size()); + assertEquals(1, query.list(QProduct.product).getMetadata().getProjection().size()); + } + +} diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/SQLSubQueryTest.java b/querydsl-sql/src/test/java/com/mysema/query/sql/SQLSubQueryTest.java new file mode 100644 index 000000000..937f56121 --- /dev/null +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/SQLSubQueryTest.java @@ -0,0 +1,19 @@ +package com.mysema.query.sql; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.mysema.query.sql.domain.QEmployee; + +public class SQLSubQueryTest { + + @Test + public void Multiple_Projections(){ + SQLSubQuery query = new SQLSubQuery(); + query.from(QEmployee.employee); + assertEquals(1, query.list(QEmployee.employee).getMetadata().getProjection().size()); + assertEquals(1, query.list(QEmployee.employee).getMetadata().getProjection().size()); + } + +}