我正在使用Mybatis 3.2.6并实现自定义结果处理程序。我在使用简单的数据类型参数之前完成了这个并且没有任何问题。这一次,我需要传递几个参数......我使用的签名是
session.select(statement, parameter, handler);
对于参数I,我创建了一个简单的POJO,可以轻松发送我需要的内容。它如下:
public class DifferenceParam {
private int current;
private int compare;
private String table;
private String comparator;
/**
* Constructor excluding comparator. Will default a value of
* "code" to compare content on, e.g., <br/>
* {@code select * from a minus select * from b where a.code = b.code } <br/>
* @param table
* @param current
* @param compare
*/
public DifferenceParam(String table, int current, int compare) {
this(table, "code", current, compare);
}
/**
* Constructor providing a specific column to compare on, e.g. <br/>
* {@code select * from a minus select * from b where a.[comparator] = b.[comparator] } <br/>
* @param table
* @param comparator
* @param current
* @param compare
*/
public DifferenceParam(String table, String comparator, int current, int compare) {
this.table = table;
this.comparator = comparator;
this.current = current;
this.compare = compare;
}
/** Appropriate setters and getters to follow **/
}
目前处理程序实现是无关紧要的,因为我事先得到了一个例外......我执行的查询是:
<select id="getCodeSetModifications" parameterType="DifferenceParam" resultType="Code">
select *
from
(
select * from ${param.table} where revision_seq = #{param.current}
minus
select * from ${param.table} where revision_seq = #{param.compare}
) a, ${param.table} b
where a.${param.comparator} = b.${param.comparator}
and b.revision_seq = #{param.compare}
</select>
以下是界面
public List<Code> getCodeSetModifications(@Param("param") DifferenceParam param);
我遇到的问题是通过映射器执行,例如,
session.getMapper(DifferenceParam.class);
工作正常,但是当我通过会话中的select调用时,我得到以下异常。
Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'param' in 'class com.mmm.his.cer.cerval.uidifference.map.param.DifferenceParam'
Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'param' in 'class com.mmm.his.cer.cerval.uidifference.map.param.DifferenceParam'
我已经调试过,因为我可以进入Mybatis,但我没有运气。
提前致谢...
答案 0 :(得分:0)
当您使用session.getMapper(DifferenceParam.class);
时,mybatis会查找@Param
注释并在查询中使用它的值。
当您调用session.select(statement, parameter, handler);
时,不会发生此类映射。
尝试将public DifferenceParam getParam() { return this; }
添加到DifferenceParam以解决此问题。
答案 1 :(得分:0)
当MyBatis查询只有一个参数时。不需要#{param.}
参考。
因为它默认使用唯一的参数。
因此,当您使用${param.table}
时,实际上是使用#{DifferenceParam.param.table}
。
因为它认为${param.}
内的#{DifferenceParam.}