From 56622abb4976c77ebfcdd7842ffae42983b7aa50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 14 Jul 2008 13:37:07 +0000 Subject: [PATCH] added support for 'inner join fetch' and 'left join fetch' --- querydsl-hql/pom.xml | 2 +- .../com/mysema/query/grammar/HqlQueryBase.java | 15 ++++++++++++++- .../com/mysema/query/grammar/HqlSerializer.java | 12 +++++++++--- .../java/com/mysema/query/grammar/JoinMeta.java | 11 +++++++++++ .../com/mysema/query/grammar/types/HqlTypes.java | 5 +++-- .../mysema/query/grammar/hql/HqlParserTest.java | 3 ++- 6 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 querydsl-hql/src/main/java/com/mysema/query/grammar/JoinMeta.java diff --git a/querydsl-hql/pom.xml b/querydsl-hql/pom.xml index 9ed369658..b11940d0e 100644 --- a/querydsl-hql/pom.xml +++ b/querydsl-hql/pom.xml @@ -7,7 +7,7 @@ com.mysema.querydsl querydsl-root - 0.2.5 + 0.2.6 com.mysema.querydsl diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java index 78c50aeec..1418b18f9 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java @@ -7,7 +7,10 @@ package com.mysema.query.grammar; import java.util.List; +import com.mysema.query.JoinExpression; +import com.mysema.query.JoinType; import com.mysema.query.QueryBase; +import com.mysema.query.grammar.types.Expr.Entity; /** * HqlQueryBase provides. @@ -15,7 +18,7 @@ import com.mysema.query.QueryBase; * @author tiwe * @version $Id$ */ -public class HqlQueryBase> extends QueryBase{ +public class HqlQueryBase> extends QueryBase{ private List constants; @@ -31,6 +34,16 @@ public class HqlQueryBase> extends QueryBase{ return serializer.toString(); } + public A innerJoin(JoinMeta meta, Entity o) { + joins.add(new JoinExpression(JoinType.INNERJOIN, o, meta)); + return (A) this; + } + + public A leftJoin(JoinMeta meta, Entity o) { + joins.add(new JoinExpression(JoinType.LEFTJOIN, o, meta)); + return (A) this; + } + public List getConstants() { return constants; } diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java index bd793b0f2..cd823eec0 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java @@ -67,7 +67,7 @@ public class HqlSerializer extends VisitorAdapter{ return constants; } - public void serialize(List> select, List joins, + public void serialize(List> select, List> joins, Expr.Boolean where, List> groupBy, Expr.Boolean having, List> orderBy, boolean forCountRow){ if (forCountRow){ @@ -77,7 +77,7 @@ public class HqlSerializer extends VisitorAdapter{ } _append("from "); for (int i=0; i < joins.size(); i++){ - JoinExpression je = joins.get(i); + JoinExpression je = joins.get(i); if (i > 0){ String sep = ", "; switch(je.getType()){ @@ -88,6 +88,12 @@ public class HqlSerializer extends VisitorAdapter{ } _append(sep); } + if (je.getMetadata() != null){ + switch(je.getMetadata()){ + case FETCH: _append("fetch "); break; + } + } + // type specifier if (je.getTarget() instanceof Path.Entity){ Path.Entity pe = (Path.Entity)je.getTarget(); @@ -245,7 +251,7 @@ public class HqlSerializer extends VisitorAdapter{ } protected void visit(SubQuery query) { - QueryBase.Metadata md = query.getQuery().getMetadata(); + QueryBase.Metadata md = query.getQuery().getMetadata(); _append("("); serialize(md.getSelect(), md.getJoins(), md.getWhere(), md.getGroupBy(), md.getHaving(), diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/JoinMeta.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/JoinMeta.java new file mode 100644 index 000000000..6e31e343f --- /dev/null +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/JoinMeta.java @@ -0,0 +1,11 @@ +package com.mysema.query.grammar; + +/** + * JoinMeta provides + * + * @author tiwe + * @version $Id$ + */ +public enum JoinMeta { + FETCH +} diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/types/HqlTypes.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/types/HqlTypes.java index 071a8abab..7ab9700a4 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/types/HqlTypes.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/types/HqlTypes.java @@ -7,6 +7,7 @@ package com.mysema.query.grammar.types; import com.mysema.query.Query; import com.mysema.query.QueryBase; +import com.mysema.query.grammar.JoinMeta; import com.mysema.query.grammar.OrderSpecifier; /** @@ -59,7 +60,7 @@ public class HqlTypes { */ public static class SubQuery extends Expr implements Query>, CollectionType{ @SuppressWarnings("unchecked") - private QueryBase query = new QueryBase(); + private QueryBase query = new QueryBase(); public SubQuery(Expr select) { super(null); query.select(select); @@ -67,7 +68,7 @@ public class HqlTypes { @SuppressWarnings("unchecked") public SubQuery from(Entity... o) {query.from(o); return this;} public SubQuery fullJoin(Entity o) {query.fullJoin(o); return this;} - public QueryBase getQuery(){ return query;} + public QueryBase getQuery(){ return query;} public SubQuery groupBy(Expr... o) {query.groupBy(o); return this;} public SubQuery having(Boolean o) {query.having(o); return this;} public SubQuery innerJoin(Entity o) {query.innerJoin(o); return this;} diff --git a/querydsl-hql/src/test/java/com/mysema/query/grammar/hql/HqlParserTest.java b/querydsl-hql/src/test/java/com/mysema/query/grammar/hql/HqlParserTest.java index 49bcc00ba..592b1c52e 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/grammar/hql/HqlParserTest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/grammar/hql/HqlParserTest.java @@ -28,6 +28,7 @@ import com.mysema.query.Domain1Dtos; import com.mysema.query.Domain1.Catalog; import com.mysema.query.grammar.HqlGrammar; import com.mysema.query.grammar.HqlQueryBase; +import com.mysema.query.grammar.JoinMeta; import com.mysema.query.grammar.hql.HqlDomain.Color; import com.mysema.query.grammar.hql.HqlDomain.DomesticCat; import com.mysema.query.grammar.hql.HqlDomain.Payment; @@ -73,7 +74,7 @@ public class HqlParserTest extends HqlQueryBase implements Domain // parse( "from eg.Cat as cat join cat.mate as mate left join cat.kittens as kitten" ); from(cat).join(cat.mate.as(mate)).leftJoin(cat.kittens.as(kitten)).parse(); // parse( "from eg.Cat as cat\ninner join fetch cat.mate\nleft join fetch cat.kittens" ); - from(cat).innerJoin(cat.mate).leftJoin(cat.kittens).parse(); + from(cat).innerJoin(cat.mate).leftJoin(JoinMeta.FETCH, cat.kittens).parse(); } /**