From cbf05c121f98ccac4da0d72efb284c8503d9f60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 5 Aug 2011 06:41:17 +0000 Subject: [PATCH] #810835 : added support for tuples in WHERE part --- .../com/mysema/query/jpa/JPQLSerializer.java | 13 ++++++- .../java/com/mysema/query/jpa/TupleTest.java | 34 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 querydsl-jpa/src/test/java/com/mysema/query/jpa/TupleTest.java diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java index 609dc36a0..d32d8c62a 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java @@ -72,6 +72,8 @@ public class JPQLSerializer extends SerializerBase { private final JPQLTemplates templates; + private boolean inProjection = false; + static{ joinTypes.put(JoinType.DEFAULT, COMMA); joinTypes.put(JoinType.FULLJOIN, "\n full join "); @@ -119,6 +121,8 @@ public class JPQLSerializer extends SerializerBase { List> orderBy = metadata.getOrderBy(); // select + boolean inProjectionOrig = inProjection; + inProjection = true; if (projection != null){ append(SELECT).append(projection).append("\n"); @@ -144,6 +148,7 @@ public class JPQLSerializer extends SerializerBase { handle(COMMA, select).append("\n"); } + inProjection = inProjectionOrig; // from append(FROM); @@ -270,7 +275,13 @@ public class JPQLSerializer extends SerializerBase { @Override public Void visit(FactoryExpression expr, Void context) { - super.visit(expr, context); + if (!inProjection) { + append("("); + super.visit(expr, context); + append(")"); + } else { + super.visit(expr, context); + } return null; } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/TupleTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/TupleTest.java new file mode 100644 index 000000000..278a2329e --- /dev/null +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/TupleTest.java @@ -0,0 +1,34 @@ +package com.mysema.query.jpa; + +import org.junit.Test; + +import com.mysema.query.jpa.domain.QCat; +import com.mysema.query.jpa.hibernate.HibernateSubQuery; +import com.mysema.query.types.QTuple; +import com.mysema.query.types.SubQueryExpression; + +public class TupleTest extends AbstractQueryTest { + + @Test + public void test() { + QCat cat = QCat.cat; + + SubQueryExpression subQuery = subQuery().from(cat) + .where(subQuery() + .from(cat) + .groupBy(cat.mate) + .list(new QTuple(cat.mate, cat.birthdate.max())) + .contains(new QTuple(cat.mate, cat.birthdate))) + .list(new QTuple(cat.birthdate, cat.name, cat.mate)); + + assertToString( + "(select cat.birthdate, cat.name, cat.mate from Cat cat " + + "where (cat.mate, cat.birthdate) in " + + "(select cat.mate, max(cat.birthdate) from Cat cat group by cat.mate))", subQuery); + } + + private HibernateSubQuery subQuery() { + return new HibernateSubQuery(); + } + +}