不能在mapper文件中使用带参数的方法

时间:2014-04-03 10:07:32

标签: datamapper mybatis

Java 1.7,WildFly 8,MyBatis 3.2.6,PostgreSQL 9.4。

我有原型,这是一个简单的借书系统。我使用MyBatis作为ORM。一切都很好,花花公子,直到我尝试过滤器。 有书桌。获取书籍列表在mapper中定义如下:

<select id="selectBooks" resultType="org.bookman.json.library.JsonBook">
  select id, created, inclusion_date as inclusionDate, title, author
  from bok_books
  <where>
    <if test="filter('title') != null">
      title ilike #{filter('title')}||'%'
    </if>
  </where>
  order by ${orderCols}
</select>

EL-filter(String)和getOrderCols()中使用了两种方法。选择以这种方式调用:

TableReqHnd bookHnd = new TableReqHnd();
... // among other things sets filter data
List<JsonBook> books = sqlSession.selectList("selectBooks", bookHnd, rowBounds);

这就是TableReqHnd类的外观:

public class TableReqHnd
{
  private Map<String, String> filters        = new HashMap<>();
  ...
  public String getOrderCols()
  {
    ...
  }
  ...
  public String filter(String fieldId)
  {
    if (!filters.containsKey(fieldId)) return null;
    return filters.get(fieldId);
  }
}

为什么我这样做?它允许我为任何表重用TableReqHnd对象,只需定义新的排序值,过滤器等。我不必为每个表创建单独的类,每个过滤器都有自己的setter和getter。

现在问题本身。方法getOrderCols()工作正常,但filter(String)没有。以下是抛出的异常:http://pastebin.com/raw.php?i=9jAjBhtd

它主要抛出java.lang.NoSuchMethodException:filter(java.lang.String)。我觉得很奇怪。这个方法肯定存在于TableReqHnd中:public String filter(String fieldId)。 $ {orderCols}工作正常(它只是简单的getter public String getOrderCols())。

根据OGNL规范,请致电

filter('title')

应该是正确的。实际上例外确认它应该是可能的,它只是因某种原因找不到方法。任何人都知道它是否可以以某种方式修复?

1 个答案:

答案 0 :(得分:0)

你试试吗

<select id="selectBooks" paramType="org.bookman.json.library.JsonBook">
  select id, created, inclusion_date as inclusionDate, title, author
  from bok_books
  <where>
    <if test="filter('title') != null">
      title ilike #{filter('title')}||'%'
    </if>
  </where>
  order by ${orderCols}
</select>