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')
应该是正确的。实际上例外确认它应该是可能的,它只是因某种原因找不到方法。任何人都知道它是否可以以某种方式修复?
答案 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>