Spring Boot和MyBatis和H2 - VARCHAR(1024)列的值前面有 "clob0:"。

问题描述 投票:0回答:1

我有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正确处理这种类型?我在文档中真的找不到任何东西。

spring spring-boot h2 mybatis spring-mybatis
1个回答
0
投票

我是这样修正的。

@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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.