Самый простой вариант для изменения SQL-запроса.
Преобразуйте значение enum в верхний регистр в запросе:
<select id="getGreeks" resultType="Greek">
SELECT UPPER(greek) greek FROM `greek_table`
</select>
Другой вариант, который нельзя напрямую использовать в этом случае, но можно использовать в других случаях, - это использовать обработчик пользовательского типа.
В текущей версии mybatis (3.5.0) невозможно указать обработчик типа для основной сущности, которая возвращается, поэтому для запроса, в котором возвращаются значения перечисления, обработчик пользовательского типа использовать нельзя. Но во многих случаях, когда enum является полем объекта, возвращаемого картографом, он работает.
Вы можете создать свой собственный обработчик типа что-то вроде:
public class GreekEnumTypeHandler extends BaseTypeHandler<Greek> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (jdbcType == null) {
ps.setString(i, parameter.name());
} else {
ps.setObject(i, parameter.name(), jdbcType.TYPE_CODE);
}
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
return s == null ? null : Greek.valueOf(s.toUpperCase());
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String s = rs.getString(columnIndex);
return s == null ? null : Greek.valueOf(s.toUpperCase());
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String s = cs.getString(columnIndex);
return s == null ? null : Greek.valueOf(s.toUpperCase());
}
}
А затем используйте его в маппере так:
<resultMap id="entityMap" type="Entity">
<id property="id" column="id"/>
<result property="greek" column="greek" typeHandler="GreekEnumTypeHandler"/>
</resultMap>
<select id="getEntity" resultMap="entityMap">
SELECT id, greek FROM entity
</select>