diff --git a/src/main/java/com/avaje/ebean/plugin/ExpressionPath.java b/src/main/java/com/avaje/ebean/plugin/ExpressionPath.java index 8f529c64e..2d81119b0 100644 --- a/src/main/java/com/avaje/ebean/plugin/ExpressionPath.java +++ b/src/main/java/com/avaje/ebean/plugin/ExpressionPath.java @@ -1,5 +1,6 @@ package com.avaje.ebean.plugin; +import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.text.StringParser; /** @@ -54,4 +55,22 @@ public interface ExpressionPath { * Return the underlying JDBC type or 0 if this is not a scalar type. */ int getJdbcType(); + + /** + * Return true if this is an ManyToOne or OneToOne associated bean property. + */ + boolean isAssocId(); + + /** + * Return the Id expression string. + *
+ * Typically used to produce id = ? expression strings. + *
+ */ + String getAssocOneIdExpr(String propName, String bindOperator); + + /** + * Return the Id values for the given bean value. + */ + Object[] getAssocOneIdValues(EntityBean bean); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java index 5d3fb5cb3..dc180d9bb 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java @@ -1,6 +1,5 @@ package com.avaje.ebeaninternal.server.el; -import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.plugin.ExpressionPath; /** @@ -11,19 +10,6 @@ import com.avaje.ebean.plugin.ExpressionPath; */ public interface ElPropertyValue extends ElPropertyDeploy, ExpressionPath { - /** - * Return the Id values for the given bean value. - */ - Object[] getAssocOneIdValues(EntityBean bean); - - /** - * Return the Id expression string. - *- * Typically used to produce id = ? expression strings. - *
- */ - String getAssocOneIdExpr(String prefix, String operator); - /** * Return the logical id value expression taking into account embedded id's. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/DocQueryContext.java b/src/main/java/com/avaje/ebeaninternal/server/expression/DocQueryContext.java index d78272651..123efb830 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/DocQueryContext.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/DocQueryContext.java @@ -2,6 +2,7 @@ package com.avaje.ebeaninternal.server.expression; import com.avaje.ebean.Junction; import com.avaje.ebean.LikeType; +import com.avaje.ebean.plugin.ExpressionPath; import com.avaje.ebean.search.Match; import com.avaje.ebean.search.MultiMatch; import com.avaje.ebean.search.TextCommonTerms; @@ -142,4 +143,8 @@ public interface DocQueryContext { */ void endBoolGroup() throws IOException; + /** + * Return the expression path for the given property path. + */ + ExpressionPath getExpressionPath(String propName); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/SimpleExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/SimpleExpression.java index dee7b0d04..f373c0390 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/SimpleExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/SimpleExpression.java @@ -1,6 +1,7 @@ package com.avaje.ebeaninternal.server.expression; import com.avaje.ebean.bean.EntityBean; +import com.avaje.ebean.plugin.ExpressionPath; import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; import com.avaje.ebeaninternal.api.SpiExpression; import com.avaje.ebeaninternal.api.SpiExpressionRequest; @@ -25,7 +26,17 @@ public class SimpleExpression extends AbstractExpression { if (type == Op.BETWEEN) { throw new IllegalStateException("BETWEEN Not expected in SimpleExpression?"); } - context.writeSimple(type, propName, value); + ExpressionPath prop = context.getExpressionPath(propName); + if (prop != null && prop.isAssocId()) { + String idName = prop.getAssocOneIdExpr(propName, ""); + Object[] ids = prop.getAssocOneIdValues((EntityBean) value); + if (ids == null || ids.length != 1) { + throw new IllegalArgumentException("Expecting 1 Id value for " + idName + " but got " + ids); + } + context.writeSimple(type, idName, ids[0]); + } else { + context.writeSimple(type, propName, value); + } } public final String getPropName() {