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

标签 sql-server spring-mvc jdbctemplate

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

我使用 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)

最佳答案

问题在于 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。

关于sql-server - 无法将类型 'net.sourceforge.jtds.jdbc.ClobImpl' 的属性值转换为所需类型 'java.lang.String',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52942212/

相关文章:

sql - TSQL where 语句中如果参数为空的情况

java - Spring MVC 和 BlueMix

java - RequestParam.defaultValue 值

java - 在 JDBC 中使用 unnest(array[someArray]) 发送三个数组时出现异常

java - 如何在 try-catch block 内重新连接到数据库?

spring-mvc - 从 DB 获取 Blob 抛出 "invalid transaction handle"

mysql - MS SQL 数据库管理/IDE

sql - 在 SQL 中选择所有 XML 属性

java - 如何从传递给 Thymeleaf 的模型中调用 getters 之类的参数?

sql-server - 如何使用 select 语句初始化存储过程中的变量