diff --git a/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java b/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java index 98f3d988c..3d505fe26 100644 --- a/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java +++ b/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java @@ -28,13 +28,10 @@ import net.sf.cglib.proxy.MethodProxy; import org.apache.commons.lang.StringUtils; import com.mysema.query.types.Expression; +import com.mysema.query.types.ParametrizedExpression; import com.mysema.query.types.Path; import com.mysema.query.types.PathMetadata; import com.mysema.query.types.PathMetadataFactory; -import com.mysema.query.types.expr.CollectionExpression; -import com.mysema.query.types.expr.MapExpression; -import com.mysema.query.types.path.ListPath; -import com.mysema.query.types.path.MapPath; import com.mysema.util.ReflectionUtils; /** @@ -103,8 +100,8 @@ class PropertyAccessInvocationHandler implements MethodInterceptor { if (propToObj.containsKey(propKey)) { rv = propToObj.get(propKey); } else { - PathMetadata pm = PathMetadataFactory.forListAccess((ListPath) hostExpression, (Integer) args[0]); - Class elementType = ((CollectionExpression) hostExpression).getElementType(); + PathMetadata pm = PathMetadataFactory.forListAccess((Path)hostExpression, (Integer) args[0]); + Class elementType = ((ParametrizedExpression) hostExpression).getParameter(0); rv = newInstance(elementType, elementType, proxy, propKey, pm); } aliasFactory.setCurrent(propToExpr.get(propKey)); @@ -114,8 +111,8 @@ class PropertyAccessInvocationHandler implements MethodInterceptor { if (propToObj.containsKey(propKey)) { rv = propToObj.get(propKey); } else { - PathMetadata pm = PathMetadataFactory.forMapAccess((MapPath) hostExpression, args[0]); - Class valueType = ((MapExpression) hostExpression).getValueType(); + PathMetadata pm = PathMetadataFactory.forMapAccess((Path)hostExpression, args[0]); + Class valueType = ((ParametrizedExpression) hostExpression).getParameter(1); rv = newInstance(valueType, valueType, proxy, propKey, pm); } aliasFactory.setCurrent(propToExpr.get(propKey)); diff --git a/querydsl-core/src/main/java/com/mysema/query/types/ParametrizedExpression.java b/querydsl-core/src/main/java/com/mysema/query/types/ParametrizedExpression.java new file mode 100644 index 000000000..0980a3eb7 --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/types/ParametrizedExpression.java @@ -0,0 +1,16 @@ +package com.mysema.query.types; + +/** + * @author tiwe + * + * @param + */ +public interface ParametrizedExpression extends Expression { + + /** + * @param index + * @return + */ + Class getParameter(int index); + +} diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/CollectionExpression.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/CollectionExpression.java index 225a1320e..f1c0f4001 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/CollectionExpression.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/CollectionExpression.java @@ -8,6 +8,7 @@ package com.mysema.query.types.expr; import java.util.Collection; import com.mysema.query.types.Expression; +import com.mysema.query.types.ParametrizedExpression; /** * CollectionExpression represents java.util.Collection typed expressions @@ -17,7 +18,7 @@ import com.mysema.query.types.Expression; * @param * @see java.util.Collection */ -public interface CollectionExpression, E>{ +public interface CollectionExpression, E> extends ParametrizedExpression{ /** * Get an expression for this.contains(child) diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/MapExpression.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/MapExpression.java index 53c8cbd0e..67533b585 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/MapExpression.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/MapExpression.java @@ -5,7 +5,10 @@ */ package com.mysema.query.types.expr; +import java.util.Map; + import com.mysema.query.types.Expression; +import com.mysema.query.types.ParametrizedExpression; /** * MapExpression represents java.util.Map typed expressions @@ -16,7 +19,7 @@ import com.mysema.query.types.Expression; * @param value type * @see java.util.Map */ -public interface MapExpression { +public interface MapExpression extends ParametrizedExpression>{ /** * @param key diff --git a/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPath.java b/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPath.java index c5100ba33..f68fa8340 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPath.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPath.java @@ -10,8 +10,8 @@ import java.util.Collection; import com.mysema.commons.lang.Assert; import com.mysema.query.types.Path; -import com.mysema.query.types.PathMetadata; import com.mysema.query.types.PathImpl; +import com.mysema.query.types.PathMetadata; import com.mysema.query.types.Visitor; import com.mysema.query.types.expr.CollectionExpressionBase; @@ -84,4 +84,15 @@ public class CollectionPath extends CollectionExpressionBase,E> return pathMixin.getAnnotatedElement(); } + @Override + public Class getParameter(int index) { + if (index == 0){ + return elementType; + }else{ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + } + + + } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/path/ListPath.java b/querydsl-core/src/main/java/com/mysema/query/types/path/ListPath.java index e037356d7..31968d2f5 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/path/ListPath.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/path/ListPath.java @@ -158,4 +158,13 @@ public class ListPath> extends CollectionExpres } } + @Override + public Class getParameter(int index) { + if (index == 0){ + return elementType; + }else{ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + } + } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/path/MapPath.java b/querydsl-core/src/main/java/com/mysema/query/types/path/MapPath.java index d375a7519..acdf858a7 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/path/MapPath.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/path/MapPath.java @@ -150,5 +150,16 @@ public class MapPath> extends MapExpressionB return constructor.newInstance(pm); } } + + @Override + public Class getParameter(int index) { + if (index == 0){ + return keyType; + }else if (index == 1){ + return valueType; + }else{ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + } } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/path/SetPath.java b/querydsl-core/src/main/java/com/mysema/query/types/path/SetPath.java index e0a513bc9..99f2d46a0 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/path/SetPath.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/path/SetPath.java @@ -83,5 +83,14 @@ public class SetPath extends CollectionExpressionBase,E> implements Pa public AnnotatedElement getAnnotatedElement(){ return pathMixin.getAnnotatedElement(); } + + @Override + public Class getParameter(int index) { + if (index == 0){ + return elementType; + }else{ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + } } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/query/ListSubQuery.java b/querydsl-core/src/main/java/com/mysema/query/types/query/ListSubQuery.java index e9029a5db..2684a42d6 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/query/ListSubQuery.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/query/ListSubQuery.java @@ -78,5 +78,14 @@ public final class ListSubQuery extends CollectionExpressionBase,A> i public Expression as(Expression alias) { return SimpleOperation.create(alias.getType(),(Operator)Ops.ALIAS, this, alias); } + + @Override + public Class getParameter(int index) { + if (index == 0){ + return elementType; + }else{ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + } }