为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM 8
【操作系统】:linux
【CPU】: intel
【问题描述】*:我们的 sql 在控制台里执行是可以正常执行的,但在程序里使用jdbc 的方式执行就报错了。
报错信息 :
### Cause: dm.jdbc.driver.DMException: Fail to cast string
; SQL []; Fail to cast string; nested exception is dm.jdbc.driver.DMException: Fail to cast string
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:102)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy127.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy150.getProjectFarmCount(Unknown Source)
at com.za.heaven.eye.service.PatrolRecordService.getPatrolAreaList(PatrolRecordService.java:1162)
at com.za.heaven.eye.service.PatrolRecordService$$FastClassBySpringCGLIB$$e0ec4fc9.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at com.za.heaven.eye.service.PatrolRecordService$$EnhancerBySpringCGLIB$$3f89fdd0.getPatrolAreaList(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:216)
at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:470)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.za.heaven.eye.service.PatrolRecordService$$EnhancerBySpringCGLIB$$ea9acfb4.getPatrolAreaList(<generated>)
at com.za.heaven.eye.controller.admin.PatrolRecordController.getPatrolAreaList(PatrolRecordController.java:58)
原始sql
SELECT
/*+ group_opt_flag(1)*/
ifnull(count(DISTINCT subject.farm_id),
0) totalfarmcount
FROM
frp_archive.tbl_farm_by_project_rule subject
INNER JOIN frp_produce.tbl_farm a ON
subject.farm_id = a.id
WHERE
(( substring_index('2025',
'-',
1) = YEAR(date_add( curdate(),
INTERVAL '-1' DAY ))
AND MONTH(date_add( curdate(),
INTERVAL '-1' DAY )) = MONTH(subject.archive_date)
AND substring_index(subject.archive_date,
'-',
1) = substring_index('2025',
'-',
1) )
OR ( substring_index('2025',
'-',
1) != YEAR(date_add( curdate(),
INTERVAL '-1' DAY ))
AND MONTH(subject.archive_date) = 12
AND substring_index(subject.archive_date,
'-',
1) = substring_index('2025',
'-',
1) ))
AND a.county_id = 310113
这个应该是因为返回的结果是个整型,而代码框架里承接的是字符串,可以试试在框架里使用整型的对象,或者在sql语句里将结果cast as varchar这样转成字符串。
SELECT SESS_ID,SQL_TEXT,STATE,CURR_SCH,CURR_HOST,CLNT_IP,CLNT_VER FROM V$SESSIONS;
根据IP和CLNT_IP看下JDBC对应的版本是不是低于数据库版本,如果是的话,用数据库安装目录 driver/jdbc/下的驱动替换JDBC的驱动,然后重启应用再看看