次のコードで再現できる。
public class AbstractDomain<T extends Comparable<T>, REPR extends AbstractDomain<T, REPR>> implements Comparable<REPR> { private final T value; public AbstractDomain(final T value) { this.value = value; } public T getValue() { return value; } @Override public String toString() { return value.toString(); } @Override public int hashCode() { return value.hashCode(); } public boolean canEqual(final Object other) { return getClass().isInstance(other); } @Override public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (!getClass().isInstance(obj)) return false; final AbstractDomain<?, ?> other = getClass().cast(obj); return other.canEqual(this) && value.equals(other.value); } @Override public int compareTo(final REPR o) { return getValue().compareTo(o.getValue()); } }
@Domain(valueType = String.class) public class Name extends AbstractDomain<String, Name> { public Name(String value) { super(value); } }
@Dao(config = AppConfig.class) public interface EmployeeDao { @Select List<Employee> selectByNotEmptyName(Name name); }
select * from employee where /*%if @isNotEmpty(name.value) */ name = /* name */'hoge' /*%end*/
Caused by: org.seasar.doma.internal.expr.ExpressionException: [DOMA3028] 式[ @isNotEmpty(name.value) ]の評価に失敗しました([12]番目の文字付近)。関数[isNotEmpty(java.lang.Comparable)]が見つかりませんでした。関数名、パラメータの数、パラメータの型が正しいか確認してください。
at org.seasar.doma.internal.expr.ExpressionEvaluator.visitFunctionOperatorNode(ExpressionEvaluator.java:616)
at org.seasar.doma.internal.expr.ExpressionEvaluator.visitFunctionOperatorNode(ExpressionEvaluator.java:75)
at org.seasar.doma.internal.expr.node.FunctionOperatorNode.accept(FunctionOperatorNode.java:63)
at org.seasar.doma.internal.expr.ExpressionEvaluator.evaluateInternal(ExpressionEvaluator.java:118)
at org.seasar.doma.internal.expr.ExpressionEvaluator.evaluate(ExpressionEvaluator.java:114)
at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder$Context.evaluate(NodePreparedSqlBuilder.java:702)
... 37 more