From 85b4434c224b1522f9427fc950f2df4c3727bf45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 2 Dec 2014 22:14:56 +0200 Subject: [PATCH] Add tests --- .../com/mysema/query/types/ValidatingVisitor.java | 5 ++--- .../com/mysema/query/jpa/JPAMapAccessVisitor.java | 7 ++++--- .../java/com/mysema/query/jpa/JPAQueryMixin.java | 4 ++++ .../test/java/com/mysema/query/AbstractJPATest.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/types/ValidatingVisitor.java b/querydsl-core/src/main/java/com/mysema/query/types/ValidatingVisitor.java index a390fb99b..2eb65fcdf 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/ValidatingVisitor.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/ValidatingVisitor.java @@ -13,13 +13,12 @@ */ package com.mysema.query.types; -import static com.mysema.query.util.CollectionUtils.add; - import java.io.Serializable; import java.util.Set; import com.mysema.query.JoinExpression; import com.mysema.query.QueryMetadata; +import static com.mysema.query.util.CollectionUtils.add; /** * ValidatingVisitor visits expressions and ensures that only known path instances are used @@ -74,7 +73,7 @@ public final class ValidatingVisitor implements Visitor>, Set< @Override public Set> visit(Path expr, Set> known) { - if (!known.contains(expr.getRoot())) { + if (!known.contains(expr.getRoot()) && expr.getMetadata().getPathType() != PathType.DELEGATE) { throw new IllegalArgumentException(String.format(errorTemplate, expr.getRoot())); } return known; diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAMapAccessVisitor.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAMapAccessVisitor.java index 808b3cd93..4edf0061e 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAMapAccessVisitor.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAMapAccessVisitor.java @@ -29,10 +29,11 @@ class JPAMapAccessVisitor extends ReplaceVisitor { // join parent as path123 on key(path123) = ... // expr -> value(path123) Path parent = pathMetadata.getParent(); - Path joinPath = new PathImpl(Object.class, "path" + (replacements.size() + 1)); - metadata.addJoin(JoinType.DEFAULT, ExpressionUtils.as(parent, joinPath)); + ParametrizedExpression parExpr = (ParametrizedExpression) parent; + Path joinPath = new PathImpl(parExpr.getParameter(1), "path" + (replacements.size() + 1)); + metadata.addJoin(JoinType.JOIN, ExpressionUtils.as(parent, joinPath)); metadata.addJoinCondition(ExpressionUtils.eq( - Expressions.operation(Object.class, JPQLOps.KEY, joinPath), + Expressions.operation(parExpr.getParameter(0), JPQLOps.KEY, joinPath), pathMetadata.getElement() instanceof Expression ? (Expression)pathMetadata.getElement() : ConstantImpl.create(pathMetadata.getElement()))); Expression value = Expressions.operation(expr.getType(), JPQLOps.VALUE, joinPath); diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java index 8207beec4..36dbb04e2 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java @@ -154,6 +154,7 @@ public class JPAQueryMixin extends QueryMixin { @Override public Expression convert(Expression expr, boolean forOrder) { + expr = (Expression) expr.accept(mapAccessVisitor, null); if (forOrder) { if (expr instanceof Path) { expr = convertPathForOrder((Path)expr); @@ -176,6 +177,9 @@ public class JPAQueryMixin extends QueryMixin { if (predicate != null) { predicate = (Predicate) ExpressionUtils.extract(predicate); } + if (predicate != null) { + predicate = (Predicate) predicate.accept(mapAccessVisitor, null); + } if (predicate != null) { // transform any usage predicate = (Predicate) predicate.accept(JPACollectionAnyVisitor.DEFAULT, new Context()); diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java index e335f8874..0d9639933 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java @@ -858,6 +858,18 @@ public abstract class AbstractJPATest { assertTrue(strings.contains("b")); } + @Test + public void Map_Get() { + QShow show = QShow.show; + query().from(show).list(show.acts.get("a")); + } + + @Test + public void Map_Get2() { + QShow show = QShow.show; + query().from(show).where(show.acts.get("X").isNull()).count(); + } + @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsKey() {