Skip to main content
 首页 » 编程设计

sql-server之无法将类型 'net.sourceforge.jtds.jdbc.ClobImpl' 的属性值转换为所需类型 'java.lang.String'

2025年12月25日47JeffreyZhao

我在 sql server 中有一个表,其中一个字段 annoation 作为文本数据类型。

我使用 spring jdbc 模板获取注释文本字段数据,然后使用 Following API (BaseRowMapper) 将表列映射到 java pojo。

下面是我的表结构:

在检索数据时出现异常。

org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'net.sourceforge.jtds.jdbc.ClobImpl' to required type 'java.lang.String' for property 'annotation'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [net.sourceforge.jtds.jdbc.ClobImpl] to required type [java.lang.String] for property 'annotation': no matching editors or conversion strategy found 
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:464) 
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:495) 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1099) 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:884) 
    at com.ecw.vascular.model.BaseRowMapper.mapRow(BaseRowMapper.java:39) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:651) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:639) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:664) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:704) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:179) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:185) 
    at com.ecw.vascular.dao.BaseDao.executeQuery(BaseDao.java:113) 
    at com.ecw.vascular.dao.ObservationDao.findByPatientAndEncounter(ObservationDao.java:64) 

请您参考如下方法:

问题在于 SQL Server 数据库中用于存储最大 16 字节字符串的数据类型。

文本最多可以存储 2 GB 的可变宽度字符串数据,因此 JDBCTemplate 使用 CLOB 从该列中检索数据。

由于最大长度为 16,一种解决方案是将数据库中的数据类型更改为更合适的 varchar

如果这不是一个选项,并且由于错误提到了 CLOB 的 jtds 实现,您可以尝试将 jdbc 连接字符串更改为

jdbc:jtds:sqlserver://ServerName;**useLOBs=false**;DatabaseName=xxx;instance=xxx 

第三个强烈不推荐的选项是在 java bean 中使用 CLOB 而不是 String,所有相关更改都需要处理数据库 LOB。