Uploaded image for project: 'Doma'
  1. Doma
  2. DOMA-274

[Core] 型引数で解決されるべき型がSQLの式コメント内で別の型として認識され評価に失敗する問題を解決しました。

XMLWordPrintable

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Major Major
    • 1.27.1
    • Affects Version/s: None
    • Component/s: Core
    • None

      次のコードで再現できる。

      AbstractDomain.java
      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());
          }
      }
      
      Name.java
      @Domain(valueType = String.class)
      public class Name extends AbstractDomain<String, Name> {
      
          public Name(String value) {
              super(value);
          }
      }
      
      EmployeeDao.java
      @Dao(config = AppConfig.class)
      public interface EmployeeDao {
          @Select
          List<Employee> selectByNotEmptyName(Name name);
      }
      
      selectByNotEmptyName.sql
      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

            Assignee:
            taedium taedium
            Reporter:
            taedium taedium
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: