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 279c1feb2..b31463b30 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 @@ -6,11 +6,20 @@ package com.mysema.query.grammar; import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.mysema.query.CascadingBoolean; import com.mysema.query.JoinExpression; import com.mysema.query.JoinType; import com.mysema.query.QueryBase; +import com.mysema.query.grammar.types.Expr; +import com.mysema.query.grammar.types.Path; +import com.mysema.query.grammar.types.PathMetadata; import com.mysema.query.grammar.types.Expr.Entity; +import com.mysema.query.hql.QueryModifiers; /** * HqlQueryBase is a base Query class for HQL @@ -18,24 +27,23 @@ import com.mysema.query.grammar.types.Expr.Entity; * @author tiwe * @version $Id$ */ -public class HqlQueryBase> extends QueryBase{ - - private static final HqlOps OPS_DEFAULT = new HqlOps(); - - private final HqlOps ops; +public abstract class HqlQueryBase> extends QueryBase{ + private static final Logger logger = LoggerFactory + .getLogger(HqlQueryBase.class); + private List constants; private String countRowsString, queryString; + protected Integer limit, offset; + + private final HqlOps ops; + public HqlQueryBase(HqlOps ops){ this.ops = ops; } - public HqlQueryBase(){ - this.ops = OPS_DEFAULT; - } - private String buildQueryString(boolean forCountRow) { if (joins.isEmpty()){ throw new IllegalArgumentException("No where clause given"); @@ -46,22 +54,6 @@ public class HqlQueryBase> extends QueryBase o) { - joins.add(new JoinExpression(JoinType.INNERJOIN, o, meta)); - return (A) this; - } - - @SuppressWarnings("unchecked") - public A leftJoin(JoinMeta meta, Entity o) { - joins.add(new JoinExpression(JoinType.LEFTJOIN, o, meta)); - return (A) this; - } - - public List getConstants() { - return constants; - } - @Override protected void clear(){ super.clear(); @@ -69,14 +61,63 @@ public class HqlQueryBase> extends QueryBase entity, + Map map) { + CascadingBoolean expr = new CascadingBoolean(); + for (Map.Entry entry : map.entrySet()){ + PathMetadata md = PathMetadata.forProperty(entity, entry.getKey()); + Path.Simple path = new Path.Simple(Object.class, md); + if (entry.getValue() != null){ + expr.and(path.eq(entry.getValue())); + }else{ + expr.and(path.isnull()); + } + } + return expr.self(); } + public A forExample(Path.Entity entity, Map map) { + select(entity).from(entity); + try { + where(createQBECondition(entity,map)); + return (A)this; + } catch (Exception e) { + String error = "Caught " + e.getClass().getName(); + logger.error(error, e); + throw new RuntimeException(error, e); + } + } + + public List getConstants() { + return constants; + } + + @SuppressWarnings("unchecked") + public A innerJoin(JoinMeta meta, Entity o) { + joins.add(new JoinExpression(JoinType.INNERJOIN, o, meta)); + return (A) this; + } + + @SuppressWarnings("unchecked") + public A leftJoin(JoinMeta meta, Entity o) { + joins.add(new JoinExpression(JoinType.LEFTJOIN, o, meta)); + return (A) this; + } + + public A limit(int limit) { + this.limit = limit; + return (A)this; + } + + public A offset(int offset) { + this.offset = offset; + return (A)this; + } + + public A restrict(QueryModifiers mod) { + return limit(mod.getLimit()).offset(mod.getOffset()); + } + public String toCountRowsString(){ if (countRowsString == null){ countRowsString = buildQueryString(true); @@ -84,4 +125,12 @@ public class HqlQueryBase> extends QueryBase{ private static final Logger logger = LoggerFactory.getLogger(HqlQuery.class); + private static final HqlOps OPS_DEFAULT = new HqlOps(); + private Integer limit, offset; private final Session session; - + public HqlQuery(Session session) { - this.session = session; + this(session, OPS_DEFAULT); } public HqlQuery(Session session, HqlOps ops) { @@ -43,30 +44,29 @@ public class HqlQuery extends HqlQueryBase{ private Query createQuery(String queryString, Integer limit, Integer offset) { Query query = session.createQuery(queryString); - QueryUtil.setConstants(query, getConstants()); - + setConstants(query, getConstants()); if (limit != null) query.setMaxResults(limit); if (offset != null) query.setFirstResult(offset); return query; } - public HqlQuery forExample(Path.Entity entity, Map map) { - select(entity).from(entity); - try { - where(QueryUtil.createQBECondition(entity,map)); - return this; - } catch (Exception e) { - String error = "Caught " + e.getClass().getName(); - logger.error(error, e); - throw new RuntimeException(error, e); + public static void setConstants(Query query, List constants){ + for (int i=0; i < constants.size(); i++){ + String key = "a"+(i+1); + Object val = constants.get(i); + if (val instanceof Collection){ + // NOTE : parameter types should be given explicitly + query.setParameterList(key,(Collection)val); + }else if (val.getClass().isArray()){ + // NOTE : parameter types should be given explicitly + query.setParameterList(key,(Object[])val); + }else{ + // NOTE : parameter types should be given explicitly + query.setParameter(key,val); + } } } - - public HqlQuery limit(int limit) { - this.limit = limit; - return this; - } - + @SuppressWarnings("unchecked") public List list(Expr expr){ select(expr); @@ -113,15 +113,6 @@ public class HqlQuery extends HqlQueryBase{ return (RT)query.uniqueResult(); } - public HqlQuery offset(int offset) { - this.offset = offset; - return this; - } - public HqlQuery restrict(QueryModifiers mod) { - this.limit = mod.getLimit(); - this.offset = mod.getOffset(); - return this; - } } diff --git a/querydsl-hql/src/main/java/com/mysema/query/hql/JpaqlQuery.java b/querydsl-hql/src/main/java/com/mysema/query/hql/JpaqlQuery.java new file mode 100644 index 000000000..7ed611ccd --- /dev/null +++ b/querydsl-hql/src/main/java/com/mysema/query/hql/JpaqlQuery.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query.hql; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.mysema.query.grammar.HqlOps; +import com.mysema.query.grammar.HqlQueryBase; +import com.mysema.query.grammar.types.Expr; + +/** + * JpaqlQuery provides + * + * @author tiwe + * @version $Id$ + */ +public class JpaqlQuery extends HqlQueryBase{ + + private static final Logger logger = LoggerFactory.getLogger(JpaqlQuery.class); + + private static final HqlOps OPS_DEFAULT = new HqlOps(); + + private final EntityManager em; + + public JpaqlQuery(EntityManager em) { + this(em, OPS_DEFAULT); + } + + public JpaqlQuery(EntityManager em, HqlOps ops) { + super(ops); + this.em = em; + } + + private Query createQuery(String queryString, Integer limit, Integer offset) { + Query query = em.createQuery(queryString); + setConstants(query, getConstants()); + if (limit != null) query.setMaxResults(limit); + if (offset != null) query.setFirstResult(offset); + return query; + } + + public static void setConstants(Query query, List constants) { + for (int i=0; i < constants.size(); i++){ + String key = "a"+(i+1); + Object val = constants.get(i); + query.setParameter(key,val); + } + } + + @SuppressWarnings("unchecked") + public List list(Expr expr){ + select(expr); + String queryString = toString(); + logger.debug("query : {}", queryString); + Query query = createQuery(queryString, limit, offset); + return query.getResultList(); + } + + @SuppressWarnings("unchecked") + public List list(Expr expr1, Expr expr2, Expr...rest){ + select(expr1, expr2); + select(rest); + String queryString = toString(); + logger.debug("query : {}", queryString); + Query query = createQuery(queryString, limit, offset); + return query.getResultList(); + } + + +} diff --git a/querydsl-hql/src/main/java/com/mysema/query/hql/QueryUtil.java b/querydsl-hql/src/main/java/com/mysema/query/hql/QueryUtil.java deleted file mode 100644 index e2c0964fe..000000000 --- a/querydsl-hql/src/main/java/com/mysema/query/hql/QueryUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2008 Mysema Ltd. - * All rights reserved. - * - */ -package com.mysema.query.hql; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.hibernate.Query; - -import com.mysema.query.CascadingBoolean; -import com.mysema.query.grammar.types.Expr; -import com.mysema.query.grammar.types.Path; -import com.mysema.query.grammar.types.PathMetadata; - - -/** - * QueryUtil provides. - * - * @author tiwe - * @version $Id$ - */ -public class QueryUtil { - - public static void setConstants(Query query, List constants){ - for (int i=0; i < constants.size(); i++){ - String key = "a"+(i+1); - Object val = constants.get(i); - if (val instanceof Collection){ - // NOTE : parameter types should be given explicitly - query.setParameterList(key,(Collection)val); - }else if (val.getClass().isArray()){ - // NOTE : parameter types should be given explicitly - query.setParameterList(key,(Object[])val); - }else{ - // NOTE : parameter types should be given explicitly - query.setParameter(key,val); - } - } - } - - public static Expr.Boolean createQBECondition(Path.Entity entity, - Map map) { - CascadingBoolean expr = new CascadingBoolean(); - for (Map.Entry entry : map.entrySet()){ - PathMetadata md = PathMetadata.forProperty(entity, entry.getKey()); - Path.Simple path = new Path.Simple(Object.class, md); - if (entry.getValue() != null){ - expr.and(path.eq(entry.getValue())); - }else{ - expr.and(path.isnull()); - } - } - return expr.self(); - } - -} diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java b/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java index cf87abd45..edb210ad5 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java @@ -35,6 +35,8 @@ import com.mysema.query.grammar.types.Expr; */ public class FeaturesTest extends HqlQueryBase{ + public FeaturesTest(){super(new HqlOps());} + // AuditLog QAuditLog log = new QAuditLog("log"); diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java index 1984aa6cf..3c3a4c31a 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java @@ -12,7 +12,6 @@ import org.junit.runner.RunWith; import antlr.RecognitionException; import antlr.TokenStreamException; -import com.mysema.query.hql.QueryUtil; import com.mysema.query.util.CustomNamingStrategy; import com.mysema.query.util.Hibernate; import com.mysema.query.util.HibernateTestRunner; @@ -33,9 +32,10 @@ public class HqlIntegrationTest extends HqlParserTest{ @Override protected void parse() throws RecognitionException, TokenStreamException{ System.out.println("query : " + toString().replace('\n', ' ')); + // create Query and execute it Query query = session.createQuery(toString()); - QueryUtil.setConstants(query, getConstants()); + HqlQuery.setConstants(query, getConstants()); try{ query.list(); }catch(Exception e){ diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/QueryBaseWithDomain.java b/querydsl-hql/src/test/java/com/mysema/query/hql/QueryBaseWithDomain.java index 34244fd37..2306b754a 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/QueryBaseWithDomain.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/QueryBaseWithDomain.java @@ -5,6 +5,7 @@ */ package com.mysema.query.hql; +import com.mysema.query.grammar.HqlOps; import com.mysema.query.grammar.HqlQueryBase; /** @@ -16,6 +17,8 @@ import com.mysema.query.grammar.HqlQueryBase; public abstract class QueryBaseWithDomain> extends HqlQueryBase{ + public QueryBaseWithDomain(){super(new HqlOps());} + QAccount account = new QAccount("account"); QAnimal an = new QAnimal("an");