diff --git a/querydsl-core/src/main/java/com/mysema/query/types/QBean.java b/querydsl-core/src/main/java/com/mysema/query/types/QBean.java index c54d51a38..b937a2958 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/QBean.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/QBean.java @@ -16,11 +16,11 @@ package com.mysema.query.types; import java.lang.reflect.Field; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; import com.mysema.util.BeanMap; import com.mysema.util.ReflectionUtils; @@ -81,9 +81,9 @@ public class QBean extends ExpressionBase implements FactoryExpression return property; } - private static Map> createBindings(Expression... args) { + private static ImmutableMap> createBindings(Expression... args) { - Map> rv = new LinkedHashMap>(args.length); + Builder> rv = ImmutableMap.builder(); for (Expression expr : args) { if (expr instanceof Path) { Path path = (Path)expr; @@ -110,16 +110,14 @@ public class QBean extends ExpressionBase implements FactoryExpression throw new IllegalArgumentException("Unsupported expression " + expr); } } - return rv; + return rv.build(); } - private final Map> bindings; + private final ImmutableMap> bindings; private final transient Map fields = new HashMap(); - private final ImmutableList> args; - private final boolean fieldAccess; /** @@ -208,8 +206,7 @@ public class QBean extends ExpressionBase implements FactoryExpression */ public QBean(Class type, boolean fieldAccess, Map> bindings) { super(type); - this.bindings = bindings; - this.args = ImmutableList.copyOf(bindings.values()); + this.bindings = ImmutableMap.copyOf(bindings); this.fieldAccess = fieldAccess; if (fieldAccess) { initFields(); @@ -240,20 +237,22 @@ public class QBean extends ExpressionBase implements FactoryExpression try { T rv = getType().newInstance(); if (fieldAccess) { - for (Map.Entry> entry : bindings.entrySet()) { - Object value = a[this.args.indexOf(entry.getValue())]; - if (value != null) { - fields.get(entry.getKey()).set(rv, value); - } - } + List keys = bindings.keySet().asList(); + for (int i = 0; i < keys.size(); i++) { + Object value = a[i]; + if (value != null) { + fields.get(keys.get(i)).set(rv, value); + } + } } else { Map beanMap = new BeanMap(rv); - for (Map.Entry> entry : bindings.entrySet()) { - Object value = a[this.args.indexOf(entry.getValue())]; - if (value != null) { - beanMap.put(entry.getKey(), value); - } - } + List keys = bindings.keySet().asList(); + for (int i = 0; i < keys.size(); i++) { + Object value = a[i]; + if (value != null) { + beanMap.put(keys.get(i), value); + } + } } return rv; } catch (InstantiationException e) { @@ -293,7 +292,7 @@ public class QBean extends ExpressionBase implements FactoryExpression return true; } else if (obj instanceof QBean) { QBean c = (QBean)obj; - return args.equals(c.args) && getType().equals(c.getType()); + return getArgs().equals(c.getArgs()) && getType().equals(c.getType()); } else { return false; } @@ -301,7 +300,7 @@ public class QBean extends ExpressionBase implements FactoryExpression @Override public List> getArgs() { - return args; + return bindings.values().asList(); } }