Spring Boot и MyBatis и H2 - столбец VARCHAR (1024) имеет значение «clob0:», добавленное к значению - PullRequest
0 голосов
/ 06 марта 2020

У меня Spring Boot и MyBatis с использованием Kotlin и с H2 в качестве тестовой базы данных (с использованием 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.

Мой столбец определен в журнале изменений ликвидабазы ​​как:

<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 правильно обрабатывал этот тип? Я ничего не могу найти в документах.

1 Ответ

0 голосов
/ 05 мая 2020

Я исправил это так:

@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()
    }
}
...