From 6bb37746af161573aa532f4e22b6d7d09e824611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 21 Jun 2012 23:51:42 +0300 Subject: [PATCH] #175 improved path in collection handling --- .../mysema/query/support/DetachableQuery.java | 2 +- .../query/jpa/AbstractJPQLSubQuery.java | 2 +- .../com/mysema/query/jpa/JPQLQueryBase.java | 27 ++++-- .../com/mysema/query/jpa/JPQLSerializer.java | 96 ++++++++++++++++--- .../jpa/hibernate/AbstractHibernateQuery.java | 3 +- .../jpa/hibernate/HibernateDeleteClause.java | 4 +- .../jpa/hibernate/HibernateUpdateClause.java | 4 +- .../query/jpa/impl/AbstractJPAQuery.java | 11 +-- .../query/jpa/impl/JPADeleteClause.java | 4 +- .../com/mysema/query/jpa/impl/JPAQuery.java | 17 ++-- .../query/jpa/impl/JPAUpdateClause.java | 4 +- .../query/jpa/sql/AbstractJPASQLQuery.java | 14 ++- .../com/mysema/query/jpa/sql/JPASQLQuery.java | 8 +- .../mysema/query/AbstractStandardTest.java | 23 +++++ .../query/_h2/H2JPAEclipseLinkTest.java | 4 - .../mysema/query/jpa/AbstractQueryTest.java | 2 +- .../jpa/JPQLCollectionAnyVisitorTest.java | 2 +- .../com/mysema/query/jpa/QueryHelper.java | 2 +- 18 files changed, 157 insertions(+), 72 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/support/DetachableQuery.java b/querydsl-core/src/main/java/com/mysema/query/support/DetachableQuery.java index 9c7b77582..ed3221a0d 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/DetachableQuery.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/DetachableQuery.java @@ -42,7 +42,7 @@ import com.mysema.query.types.query.TimeSubQuery; */ public class DetachableQuery > extends QueryBase implements Detachable { - private final DetachableMixin detachableMixin; + private final Detachable detachableMixin; public DetachableQuery(QueryMixin queryMixin) { super(queryMixin); diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java index 3260dad2d..d1287f5ca 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java @@ -191,7 +191,7 @@ public class AbstractJPQLSubQuery> extends Det public String toString() { if (!queryMixin.getMetadata().getJoins().isEmpty()) { - JPQLSerializer serializer = new JPQLSerializer(JPQLTemplates.DEFAULT); + JPQLSerializer serializer = new JPQLSerializer(JPQLTemplates.DEFAULT, null); serializer.serialize(queryMixin.getMetadata(), false, null); return serializer.toString().trim(); } else { diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLQueryBase.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLQueryBase.java index b8d335f02..bff2c2284 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLQueryBase.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLQueryBase.java @@ -15,6 +15,9 @@ package com.mysema.query.jpa; import java.util.Map; +import javax.annotation.Nullable; +import javax.persistence.EntityManager; + import com.mysema.query.QueryMetadata; import com.mysema.query.support.ProjectableQuery; import com.mysema.query.types.CollectionExpression; @@ -36,6 +39,18 @@ public abstract class JPQLQueryBase> extends Projecta private final JPQLQueryMixin queryMixin; private final JPQLTemplates templates; + + @Nullable + protected final EntityManager entityManager; + + @SuppressWarnings("unchecked") + public JPQLQueryBase(QueryMetadata md, JPQLTemplates templates, @Nullable EntityManager entityManager) { + super(new JPQLQueryMixin(md)); + super.queryMixin.setSelf((Q) this); + this.queryMixin = (JPQLQueryMixin) super.queryMixin; + this.templates = templates; + this.entityManager = entityManager; + } protected JPQLTemplates getTemplates() { return templates; @@ -44,20 +59,12 @@ public abstract class JPQLQueryBase> extends Projecta protected JPQLQueryMixin getQueryMixin() { return queryMixin; } - - @SuppressWarnings("unchecked") - public JPQLQueryBase(QueryMetadata md, JPQLTemplates templates) { - super(new JPQLQueryMixin(md)); - super.queryMixin.setSelf((Q) this); - this.queryMixin = (JPQLQueryMixin) super.queryMixin; - this.templates = templates; - } - + protected String buildQueryString(boolean forCountRow) { if (queryMixin.getMetadata().getJoins().isEmpty()) { throw new IllegalArgumentException("No joins given"); } - JPQLSerializer serializer = new JPQLSerializer(templates); + JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); serializer.serialize(queryMixin.getMetadata(), forCountRow, null); constants = serializer.getConstantToLabel(); return serializer.toString(); 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 90088a19a..53ffa85b0 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 @@ -26,14 +26,33 @@ import java.util.Set; import javax.annotation.Nullable; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; +import javax.persistence.EntityManager; import javax.persistence.EnumType; import javax.persistence.Enumerated; +import javax.persistence.PersistenceUnitUtil; +import javax.persistence.metamodel.EntityType; +import javax.persistence.metamodel.Metamodel; +import javax.persistence.metamodel.SingularAttribute; import com.mysema.query.JoinExpression; import com.mysema.query.JoinType; import com.mysema.query.QueryMetadata; import com.mysema.query.support.SerializerBase; -import com.mysema.query.types.*; +import com.mysema.query.types.Constant; +import com.mysema.query.types.ConstantImpl; +import com.mysema.query.types.EntityPath; +import com.mysema.query.types.Expression; +import com.mysema.query.types.ExpressionUtils; +import com.mysema.query.types.FactoryExpression; +import com.mysema.query.types.Operator; +import com.mysema.query.types.Ops; +import com.mysema.query.types.OrderSpecifier; +import com.mysema.query.types.ParamExpression; +import com.mysema.query.types.Path; +import com.mysema.query.types.PathImpl; +import com.mysema.query.types.PathType; +import com.mysema.query.types.Predicate; +import com.mysema.query.types.SubQueryExpression; import com.mysema.util.MathUtils; /** @@ -80,6 +99,8 @@ public class JPQLSerializer extends SerializerBase { private final JPQLTemplates templates; + private final EntityManager entityManager; + private boolean inProjection = false; static{ @@ -94,8 +115,13 @@ public class JPQLSerializer extends SerializerBase { private boolean wrapElements = false; public JPQLSerializer(JPQLTemplates templates) { + this(templates, null); + } + + public JPQLSerializer(JPQLTemplates templates, EntityManager em) { super(templates); this.templates = templates; + this.entityManager = em; } private void handleJoinTarget(JoinExpression je) { @@ -304,6 +330,17 @@ public class JPQLSerializer extends SerializerBase { } return null; } + + @SuppressWarnings("rawtypes") + private SingularAttribute getIdProperty(EntityType entity) { + Set singularAttributes = entity.getSingularAttributes(); + for (SingularAttribute singularAttribute : singularAttributes) { + if (singularAttribute.isId()){ + return singularAttribute; + } + } + return null; + } @Override @SuppressWarnings("unchecked") @@ -311,20 +348,13 @@ public class JPQLSerializer extends SerializerBase { boolean old = wrapElements; wrapElements = templates.wrapElements(operator); + // TODO : refactor each case into own method if (operator.equals(Ops.IN)) { if (args.get(1) instanceof Path) { - if (!templates.isEnumInPathSupported() && args.get(0) instanceof Constant && Enum.class.isAssignableFrom(args.get(0).getType())) { - Enumerated enumerated = ((Path)args.get(1)).getAnnotatedElement().getAnnotation(Enumerated.class); - Enum constant = (Enum)((Constant)args.get(0)).getConstant(); - if (enumerated == null || enumerated.value() == EnumType.ORDINAL) { - args = Arrays.asList(new ConstantImpl(constant.ordinal()), args.get(1)); - } else { - args = Arrays.asList(new ConstantImpl(constant.name()), args.get(1)); - } - } - - super.visitOperation(type, JPQLTemplates.MEMBER_OF, args); - } else { + visitAnyInPath(type, args); + } else if (args.get(0) instanceof Path && args.get(1) instanceof Constant) { + visitPathInCollection(type, operator, args); + } else { super.visitOperation(type, operator, args); } @@ -368,7 +398,45 @@ public class JPQLSerializer extends SerializerBase { wrapElements = old; } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "rawtypes", "unchecked" }) + private void visitPathInCollection(Class type, Operator operator, + List> args) { + // NOTE turns entityPath in collection into entityPath.id in (collection of ids) + if (entityManager != null && args.get(0).getType().isAnnotationPresent(Entity.class)) { + Path lhs = (Path) args.get(0); + Constant rhs = (Constant) args.get(1); + Metamodel metamodel = entityManager.getMetamodel(); + PersistenceUnitUtil util = entityManager.getEntityManagerFactory().getPersistenceUnitUtil(); + EntityType entityType = metamodel.entity(args.get(0).getType()); + if (entityType.hasSingleIdAttribute()) { + SingularAttribute id = getIdProperty(entityType); + lhs = new PathImpl(id.getJavaType(), lhs, id.getName()); + Set ids = new HashSet(); + for (Object entity : (Collection)rhs.getConstant()) { + ids.add(util.getIdentifier(entity)); + } + rhs = new ConstantImpl(ids); + args = Arrays.asList(lhs, rhs); + } + } + super.visitOperation(type, operator, args); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private void visitAnyInPath(Class type, List> args) { + if (!templates.isEnumInPathSupported() && args.get(0) instanceof Constant && Enum.class.isAssignableFrom(args.get(0).getType())) { + Enumerated enumerated = ((Path)args.get(1)).getAnnotatedElement().getAnnotation(Enumerated.class); + Enum constant = (Enum)((Constant)args.get(0)).getConstant(); + if (enumerated == null || enumerated.value() == EnumType.ORDINAL) { + args = Arrays.asList(new ConstantImpl(constant.ordinal()), args.get(1)); + } else { + args = Arrays.asList(new ConstantImpl(constant.name()), args.get(1)); + } + } + super.visitOperation(type, JPQLTemplates.MEMBER_OF, args); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) private List> normalizeNumericArgs(List> args) { boolean hasConstants = false; Class numType = null; diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java index c719c0835..ee3ca90bf 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java @@ -39,7 +39,6 @@ import com.mysema.query.SearchResults; import com.mysema.query.jpa.HQLTemplates; import com.mysema.query.jpa.JPQLQueryBase; import com.mysema.query.jpa.JPQLTemplates; -import com.mysema.query.types.ArrayConstructorExpression; import com.mysema.query.types.Expression; import com.mysema.query.types.FactoryExpression; import com.mysema.query.types.FactoryExpressionUtils; @@ -78,7 +77,7 @@ public abstract class AbstractHibernateQuery } public AbstractHibernateQuery(SessionHolder session, JPQLTemplates patterns, QueryMetadata metadata) { - super(metadata, patterns); + super(metadata, patterns, null); this.session = session; } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java index a984c956a..2368796e2 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java @@ -63,7 +63,7 @@ public class HibernateDeleteClause implements DeleteClause constants = serializer.getConstantToLabel(); @@ -80,7 +80,7 @@ public class HibernateDeleteClause implements DeleteClause constants = serializer.getConstantToLabel(); @@ -124,7 +124,7 @@ public class HibernateUpdateClause implements @Override public String toString() { - JPQLSerializer serializer = new JPQLSerializer(templates); + JPQLSerializer serializer = new JPQLSerializer(templates, null); serializer.serializeForUpdate(metadata); return serializer.toString(); } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java index e2ae589df..b9b3a358b 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java @@ -65,8 +65,6 @@ public abstract class AbstractJPAQuery> extends JP } } - private final JPASessionHolder sessionHolder; - protected final Map hints = new HashMap(); @Nullable @@ -78,12 +76,11 @@ public abstract class AbstractJPAQuery> extends JP protected boolean factoryExpressionUsed = false; public AbstractJPAQuery(EntityManager em) { - this(new DefaultSessionHolder(em), HQLTemplates.DEFAULT, new DefaultQueryMetadata()); + this(em, HQLTemplates.DEFAULT, new DefaultQueryMetadata()); } - public AbstractJPAQuery(JPASessionHolder sessionHolder, JPQLTemplates patterns, QueryMetadata metadata) { - super(metadata, patterns); - this.sessionHolder = sessionHolder; + public AbstractJPAQuery(EntityManager em, JPQLTemplates patterns, QueryMetadata metadata) { + super(metadata, patterns, em); } public long count() { @@ -135,7 +132,7 @@ public abstract class AbstractJPAQuery> extends JP } private Query createQuery(String queryString, @Nullable QueryModifiers modifiers, boolean forCount) { - Query query = sessionHolder.createQuery(queryString); + Query query = entityManager.createQuery(queryString); JPAUtil.setConstants(query, getConstants(), getMetadata().getParams()); if (modifiers != null && modifiers.isRestricting()) { if (modifiers.getLimit() != null) { diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java index 75517d0e8..816da0737 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java @@ -54,7 +54,7 @@ public class JPADeleteClause implements DeleteClause{ @Override public long execute() { - JPQLSerializer serializer = new JPQLSerializer(templates); + JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); serializer.serializeForDelete(metadata); Map constants = serializer.getConstantToLabel(); @@ -71,7 +71,7 @@ public class JPADeleteClause implements DeleteClause{ @Override public String toString() { - JPQLSerializer serializer = new JPQLSerializer(templates); + JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); serializer.serializeForDelete(metadata); return serializer.toString(); } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAQuery.java index 6f006c3c9..9bd394bfc 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAQuery.java @@ -34,7 +34,7 @@ public final class JPAQuery extends AbstractJPAQuery implements JPQLQu * The query can be attached via the clone method */ public JPAQuery() { - super(new NoSessionHolder(), HQLTemplates.DEFAULT, new DefaultQueryMetadata()); + super(null, HQLTemplates.DEFAULT, new DefaultQueryMetadata()); } /** @@ -43,8 +43,7 @@ public final class JPAQuery extends AbstractJPAQuery implements JPQLQu * @param em */ public JPAQuery(EntityManager em) { - super(new DefaultSessionHolder(em), JPAProvider.getTemplates(em), - new DefaultQueryMetadata()); + super(em, JPAProvider.getTemplates(em), new DefaultQueryMetadata()); } /** @@ -53,7 +52,7 @@ public final class JPAQuery extends AbstractJPAQuery implements JPQLQu * @param em */ public JPAQuery(EntityManager em, QueryMetadata metadata) { - super(new DefaultSessionHolder(em), JPAProvider.getTemplates(em), metadata); + super(em, JPAProvider.getTemplates(em), metadata); } /** @@ -63,18 +62,18 @@ public final class JPAQuery extends AbstractJPAQuery implements JPQLQu * @param patterns */ public JPAQuery(EntityManager em, JPQLTemplates patterns) { - super(new DefaultSessionHolder(em), patterns, new DefaultQueryMetadata()); + super(em, patterns, new DefaultQueryMetadata()); } /** * Creates a new query * - * @param session + * @param em * @param templates * @param metadata */ - public JPAQuery(JPASessionHolder session, JPQLTemplates templates, QueryMetadata metadata) { - super(session, templates, metadata); + public JPAQuery(EntityManager em, JPQLTemplates templates, QueryMetadata metadata) { + super(em, templates, metadata); } /** @@ -84,7 +83,7 @@ public final class JPAQuery extends AbstractJPAQuery implements JPQLQu * @return */ public JPAQuery clone(EntityManager entityManager) { - JPAQuery q = new JPAQuery(new DefaultSessionHolder(entityManager), getTemplates(), getMetadata().clone()); + JPAQuery q = new JPAQuery(entityManager, getTemplates(), getMetadata().clone()); q.factoryExpressionUsed = factoryExpressionUsed; q.flushMode = flushMode; q.hints.putAll(hints); diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java index a478d7b46..bda2d27de 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java @@ -59,7 +59,7 @@ public class JPAUpdateClause implements UpdateClause{ @Override public long execute() { - JPQLSerializer serializer = new JPQLSerializer(templates); + JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); serializer.serializeForUpdate(metadata); Map constants = serializer.getConstantToLabel(); @@ -112,7 +112,7 @@ public class JPAUpdateClause implements UpdateClause{ @Override public String toString() { - JPQLSerializer serializer = new JPQLSerializer(templates); + JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); serializer.serializeForUpdate(metadata); return serializer.toString(); } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/AbstractJPASQLQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/AbstractJPASQLQuery.java index 9bff31494..cffdf4b54 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/AbstractJPASQLQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/AbstractJPASQLQuery.java @@ -35,8 +35,6 @@ import com.mysema.query.QueryModifiers; import com.mysema.query.SearchResults; import com.mysema.query.jpa.AbstractSQLQuery; import com.mysema.query.jpa.NativeSQLSerializer; -import com.mysema.query.jpa.impl.DefaultSessionHolder; -import com.mysema.query.jpa.impl.JPASessionHolder; import com.mysema.query.jpa.impl.JPAUtil; import com.mysema.query.sql.SQLTemplates; import com.mysema.query.sql.Union; @@ -61,7 +59,7 @@ public abstract class AbstractJPASQLQuery & com @Nullable private Map constants; - private final JPASessionHolder session; + private final EntityManager entityManager; protected final SQLTemplates templates; @@ -79,12 +77,12 @@ public abstract class AbstractJPASQLQuery & com protected FlushModeType flushMode; public AbstractJPASQLQuery(EntityManager entityManager, SQLTemplates sqlTemplates) { - this(new DefaultSessionHolder(entityManager), sqlTemplates, new DefaultQueryMetadata()); + this(entityManager, sqlTemplates, new DefaultQueryMetadata()); } - public AbstractJPASQLQuery(JPASessionHolder session, SQLTemplates sqlTemplates, QueryMetadata metadata) { + public AbstractJPASQLQuery(EntityManager entityManager, SQLTemplates sqlTemplates, QueryMetadata metadata) { super(metadata); - this.session = session; + this.entityManager = entityManager; this.templates = sqlTemplates; } @@ -114,13 +112,13 @@ public abstract class AbstractJPASQLQuery & com Query query; if (projection.get(0) instanceof EntityPath) { if (projection.size() == 1) { - query = session.createSQLQuery(queryString, projection.get(0).getType()); + query = entityManager.createNativeQuery(queryString, projection.get(0).getType()); } else { throw new IllegalArgumentException("Only single element entity projections are supported"); } } else { - query = session.createSQLQuery(queryString); + query = entityManager.createNativeQuery(queryString); } if (lockMode != null) { diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java index 4a2ddd36b..b525ed5b0 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java @@ -16,8 +16,6 @@ package com.mysema.query.jpa.sql; import javax.persistence.EntityManager; import com.mysema.query.QueryMetadata; -import com.mysema.query.jpa.impl.DefaultSessionHolder; -import com.mysema.query.jpa.impl.JPASessionHolder; import com.mysema.query.sql.SQLCommonQuery; import com.mysema.query.sql.SQLTemplates; @@ -34,12 +32,12 @@ public final class JPASQLQuery extends AbstractJPASQLQuery implemen super(entityManager, sqlTemplates); } - public JPASQLQuery(JPASessionHolder session, SQLTemplates sqlTemplates, QueryMetadata metadata) { - super(session, sqlTemplates, metadata); + public JPASQLQuery(EntityManager entityManager, SQLTemplates sqlTemplates, QueryMetadata metadata) { + super(entityManager, sqlTemplates, metadata); } public JPASQLQuery clone(EntityManager entityManager) { - JPASQLQuery q = new JPASQLQuery(new DefaultSessionHolder(entityManager), templates, getMetadata().clone()); + JPASQLQuery q = new JPASQLQuery(entityManager, templates, getMetadata().clone()); q.flushMode = flushMode; q.hints.putAll(hints); q.lockMode = lockMode; diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java index f7a0245d0..797bbc3c3 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java @@ -39,6 +39,7 @@ import org.junit.Test; import antlr.RecognitionException; import antlr.TokenStreamException; +import com.google.common.collect.Lists; import com.mysema.commons.lang.Pair; import com.mysema.query.group.GroupBy; import com.mysema.query.group.QPair; @@ -298,6 +299,28 @@ public abstract class AbstractStandardTest { cat.kittens.any().bodyWeight.gt(10.0)).count()); } + @Test + public void Any_In1() { + //select cat from Cat cat where exists ( + // select cat_kittens from Cat cat_kittens where cat_kittens member of cat.kittens and cat_kittens in ?1) + query().from(cat).where(cat.kittens.any().in(savedCats)).list(cat); + } + + @Test + public void Any_In11() { + List ids = Lists.newArrayList(); + for (Cat cat : savedCats) ids.add(cat.getId()); + query().from(cat).where(cat.kittens.any().id.in(ids)).list(cat); + } + + @Test + public void Any_In2() { + query().from(cat).where( + cat.kittens.any().in(savedCats), + cat.kittens.any().in(savedCats.subList(0, 1)).not()) + .list(cat); + } + @Test public void JoinEmbeddable() { QBookVersion bookVersion = QBookVersion.bookVersion; diff --git a/querydsl-jpa/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java b/querydsl-jpa/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java index a5496e425..10df8fd9f 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java @@ -19,14 +19,10 @@ import static org.junit.Assert.assertTrue; import org.eclipse.persistence.config.HintValues; import org.eclipse.persistence.config.QueryHints; -import org.junit.Ignore; -import org.junit.Test; import org.junit.runner.RunWith; import com.mysema.query.AbstractJPATest; import com.mysema.query.Target; -import com.mysema.query.jpa.EclipseLinkTemplates; -import com.mysema.query.jpa.JPQLTemplates; import com.mysema.query.jpa.domain.QCat; import com.mysema.testutil.JPAConfig; import com.mysema.testutil.JPATestRunner; diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/AbstractQueryTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/AbstractQueryTest.java index cec53c4a6..a67f7e82b 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/AbstractQueryTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/AbstractQueryTest.java @@ -28,7 +28,7 @@ public abstract class AbstractQueryTest implements Constants{ } protected static void assertToString(String expected, Expression expr) { - JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); + JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT, null); assertEquals(expected, serializer.handle(expr).toString().replace("\n", " ")); } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPQLCollectionAnyVisitorTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPQLCollectionAnyVisitorTest.java index 7433f3043..c3d4a9a36 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPQLCollectionAnyVisitorTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPQLCollectionAnyVisitorTest.java @@ -77,7 +77,7 @@ public class JPQLCollectionAnyVisitorTest { private String serialize(Expression expression){ Expression transformed = expression.accept(JPQLCollectionAnyVisitor.DEFAULT, new Context()); - JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); + JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT, null); serializer.handle(transformed); return serializer.toString(); } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/QueryHelper.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/QueryHelper.java index 4b761c9a9..6339d484a 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/QueryHelper.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/QueryHelper.java @@ -34,7 +34,7 @@ import com.mysema.query.types.Expression; class QueryHelper extends JPQLQueryBase { public QueryHelper() { - super(new DefaultQueryMetadata(), HQLTemplates.DEFAULT); + super(new DefaultQueryMetadata(), HQLTemplates.DEFAULT, null); } public long count() {