我有Spring Boot和MyBatis,使用Kotlin和H2作为测试DB(使用 liquibase)。
我有一个单元测试在使用H2时失败了。
代码是: assertEquals("Vehicle loan or lease", d[0].first)
expected:<Vehicle loan or lease> but was:<clob0: 'Vehicle loan or lease'>
Expected :Vehicle loan or lease
Actual :clob0: 'Vehicle loan or lease'
现在,由于某些原因,IBatis没有正确处理h2 clob类型。它与Postgres一起工作。
我的列在liquibase changelog中定义为:。
<column name="company" type="VARCHAR(1024)"/>
我的Mapper方法是:
@Select("select product, count(*) from complaints WHERE company = #{companyName} group by product order by 2 desc;")
fun getProductCountsByCompanyName(@Param("companyName") companyName: String): List<Pair<String, Long>>
我需要做什么才能让MyBatis正确处理这种类型?我在文档中真的找不到任何东西。
我是这样修正的。
@MappedJdbcTypes(JdbcType.VARCHAR, JdbcType.CLOB, JdbcType.CHAR, JdbcType.NVARCHAR)
@MappedTypes(String::class)
class ClobTypeHandler: TypeHandler<String> {
override fun setParameter(ps: PreparedStatement?, i: Int, parameter: String?, jdbcType: JdbcType?) {
TODO("Not yet implemented")
}
fun getFromCol(col: Any?): String{
if(col == null){ return "" }
if(col is JdbcClob){
return StreamUtils.copyToString(col.asciiStream, UTF_8)
}
else {
return col.toString()
}
}
override fun getResult(rs: ResultSet?, columnName: String?): String {
return getFromCol(rs?.getObject(columnName))
}
override fun getResult(rs: ResultSet?, columnIndex: Int): String {
return getFromCol(rs?.getObject(columnIndex))
}
override fun getResult(rs: CallableStatement?, columnIndex: Int): String {
return getFromCol(rs?.getObject(columnIndex))
}
}
@Configuration
class IBatisConfig {
@Bean
fun jdbcClobTypeHander(): TypeHandler<String> {
return ClobTypeHandler()
}
}