Mybatis No Getter Property

Floresj4 picture Floresj4 · Jun 5, 2014 · Viewed 9k times · Source

I'm working with Mybatis 3.2.6 and implementing a custom resulthandler. I've done this before using a simple datatype parameter and have had no problems. This time around I need to pass in several arguments... The signature I'm using is

session.select(statement, parameter, handler);

For parameter I've created a simple POJO to easily send in what I need. It is as follows:

public class DifferenceParam {

private int current;
private int compare;

private String table;
private String comparator;

/**
 * Constructor excluding comparator.  Will default a value of
 * &quot;code&quot; 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 **/
}

The handler implementation is irrelevant at the moment, because I get an exception well in advance... The query I'm executing is:

<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>

Here is the interface as well

public List<Code> getCodeSetModifications(@Param("param") DifferenceParam param);

The problem I'm having is that execution via a mapper e.g.,

session.getMapper(DifferenceParam.class);

works just fine, but when I invoke through a select on the session I get the following exception.

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'

I've debugged as far as I can go into Mybatis, but am having no luck.

Thanks in advance...

Answer

Aliaksei picture Aliaksei · Jul 30, 2014

When you use session.getMapper(DifferenceParam.class);, mybatis looks for @Param annotation and uses it's value in query.

When you invoke session.select(statement, parameter, handler);, such mapping doesn't occur.

Try to add public DifferenceParam getParam() { return this; } to DifferenceParam to workaround this.