无法将类型“ net.sourceforge.jtds.jdbc.ClobImpl”的属性值转换为所需的类型“ java.lang.String”

时间:2018-10-23 06:11:25

标签: sql-server spring-mvc jdbctemplate

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

我已经使用spring jdbc模板获取注释文本字段数据,然后使用了Following API( BaseRowMapper )将表列映射到Java pojo。 enter image description here

下面是我的表结构:

enter image description here

在检索数据时,我遇到了异常。

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)

1 个答案:

答案 0 :(得分:1)

问题在于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所需的所有相对更改。