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 c2b9b620f..e3d3b2605 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/DocQueryContext.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/DocQueryContext.java @@ -157,4 +157,14 @@ public interface DocQueryContext { * End nested path expressions. */ void endNested() throws IOException; + + /** + * Start a not wrapping an expression. + */ + void startNot() throws IOException; + + /** + * End a not wrapper. + */ + void endNot() throws IOException; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/IsEmptyExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/IsEmptyExpression.java index 98af042d6..950bf0ef9 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/IsEmptyExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/IsEmptyExpression.java @@ -16,15 +16,38 @@ class IsEmptyExpression extends AbstractExpression { private final String propertyPath; + private String nestedPath; + IsEmptyExpression(String propertyName, boolean empty) { super(propertyName); this.empty = empty; this.propertyPath = SplitName.split(propertyName)[0]; } + @Override + public String nestedPath(BeanDescriptor desc) { + if (empty) { + // capture the nestedPath as we want to put wrap + // a NOT around the outer of the nested path exists + this.nestedPath = propertyNestedPath(propName, desc); + return null; + } else { + return super.nestedPath(desc); + } + } + @Override public void writeDocQuery(DocQueryContext context) throws IOException { - context.writeExists(!empty, propName); + if (nestedPath == null) { + context.writeExists(!empty, propName); + } else { + // wrap NOT around the outside of nested path exists expression + context.startNot(); + context.startNested(nestedPath); + context.writeExists(empty, propName); + context.endNested(); + context.endNot(); + } } public final String getPropName() {