概要
MybatisでテーブルのCOUNTMAX値を取得した場合に、エラーとなり10分ほどハマったお話です。解決策は以外と簡単だったのでメモしておきます。
解決策
Mapperファイル
@Pramでパラメータを指定してあげます。
@Mapper
public interface CommonMapper {
@SelectProvider(type = CommonSqlProvider.class, method = "getMaxValue")
Object getMaxValue(@Param("tableName") String tableName, @Param("columnName") String columnName);
}
SqlProviderファイル(失敗例)
パラメータを#で与えるとどうやらシングルクォートで囲まれ、テーブル名の判別ができないようです。インジェクション対策に使えるので可能であれば#でパラメータを使うのが良いです。
public class CommonSqlProvider {
public String getMaxValue(String tableName, String columnName) {
SQL sql = new SQL();
sql.SELECT("nvl2(MAX(#{columnName}), MAX(#{columnName}), 0) AS MAX_NO");
sql.FROM("#{tableName}");
return sql.toString();
}
}
SqlProvaiderファイル(成功例)
パラメータを$で与えると値が直接反映され、テーブル名の判別ができるようです。どうしようもなく、インジェクションのリスクが無い箇所であればこちらの方法で良さそうです。
public class CommonSqlProvider {
public String getMaxValue(String tableName, String columnName) {
SQL sql = new SQL();
sql.SELECT("nvl2(MAX(${columnName}), MAX(${columnName}), 0) AS MAX_NO");
sql.FROM("${tableName}");
return sql.toString();
}
}