(已解决)oracle 查询数据一直提示:“error code [17004]; 无效的列类型”

12 篇文章 0 订阅
3 篇文章 0 订阅

解决方法:传入的键值对,要对应数据库的字段类型。

比如oracle的varchar,varchar2要对应 java 的string ,

number要对应java的long。

 

今天在上班启动系统的时候,一直提示“SQL state [null]; error code [17004]; 无效的列类型; nested exception is java.sql.SQLException: 无效的列类型”,我就奇怪了,为啥无端端会提示这个呢,下面贴上堆栈信息:

 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select count(*) from ( select * from tb_product ) ap join tb_domain d on ap.domain_id=d.domain_id where  d.product_line=?  and d.agent_id=?]; SQL state [null]; error code [17004]; 无效的列类型; nested exception is java.sql.SQLException: 无效的列类型

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:66)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:168)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:136)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:134)
at com.netease.mail.qiyemail.business.CorpCtrlTest.testListAddedProduct(CorpCtrlTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select count(*) from ( select * from tb_product ) ap join tb_domain d on ap.domain_id=d.domain_id where  d.product_line=?  and d.agent_id=?]; SQL state [null]; error code [17004]; 无效的列类型; nested exception is java.sql.SQLException: 无效的列类型
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:90)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:655)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:690)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:717)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:767)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:199)
at com.netease.mail.qiyemail.business.dao.spring.AddedProductDaoImpl.queryPageCount(AddedProductDaoImpl.java:240)
at com.netease.mail.qiyemail.business.service.impl.CorpServiceImpl.queryCorpAddedProductPage(CorpServiceImpl.java:2445)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy33.queryCorpAddedProductPage(Unknown Source)
at com.netease.mail.qiyemail.business.web.CorpCtrl.corpListAddedProduct(CorpCtrl.java:734)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:181)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
... 38 more
Caused by: java.sql.SQLException: 无效的列类型
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:9262)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8843)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9565)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:9548)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setObject(NewProxyPreparedStatement.java:365)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:464)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:241)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:156)
at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:292)
at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:244)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)

... 71 more

 

 

1.我就奇怪了,为啥会出现这个呢,我仔细查了创建sql的代码,是用NamedParameterJdbcTemplate的方式查询数据库的,参数化键值对的方式。

之前也有遇到过类似的问题,之前是因为放进去的键值对,有null的情况,所以提示这个。然后我就debug了很多次,确认键值对都是有值的,并没有null的情况。

2.没办法啦,只能百度一下,上面都是说数据库中时间的参数有null的情况,所以如果date类型的数据有null的时候,在转换的时候会有问题。

参考博客:

https://blog.csdn.net/weixin_39214481/article/details/80360698

 

3. 但是我仔细检查了一下,确实没有数据为空的情况啊。

于是我就继续debug,通过剪枝的方式把sql缩短排查,感谢上帝,千辛万苦排查后,终于发现,代码出现的问题是在这里。

对,就是这个罪灰祸首,浪费我一天的时间。(ProductLine 是一个枚举类型)

我看了很久,也没毛病啊,干啥不行呢?

最后查看了官网相关的资料介绍,才知道sql 的键值对,只能存放那8种基本类型进去,对,也就是int ,long, String ,boolean 等,而枚举类型是不支持的,必须要转化成对应数据库的字段类型才能查询的,啊啊啊啊啊啊,我的天啊,这么坑人啊。

于是,我看了下源码,虽然源码的query()方法,是可以放一个任意类型进去的。但是查询的参数类型,要跟数据库中字段的类型对应,比如oracle的varchar2,varchar 要对应java.util.String;number 要对应java的long才可以哦。

最后,用这种解决方式,转成string 之后才放进去啦,最后,成功啦!!!!

 

 

往期精彩:

 

FFT(Fast Fourier Transform,快速傅里叶变换)算法是一种高效的计算离散傅里叶变换(DFT)的算法。这种算法可以在较短的时间内计算出离散信号的频谱信息,而不需要进行大量的乘法和加法运算。 FFT算法的应用非常广泛,尤其在信号处理和图像处理领域中被广泛使用。在C语言中,实现FFT算法需要使用复数的数据结构和相关的运算函数。 要实现8点FFT算法,首先需要准备一个长度为8的复数数组,这个数组用来存储输入信号的时域数据。接下来,需要定义一个函数来进行FFT计算。 在C语言中,可以使用递归的方法实现FFT算法。具体步骤如下: 1.定义一个函数,输入参数是待计算的信号数组和信号的长度。 2.在函数内部,首先通过判断信号长度是否等于1来判断是否需要终止递归。如果长度等于1,则直接返回这个信号。 3.如果信号长度大于1,需要进行递归计算。将信号分为奇数索引和偶数索引的两个子数组,分别递归调用FFT函数。 4.然后将两个子数组的结果进行合并,得到FFT计算的结果。 5.最后通过复数相乘的方式计算频谱中各个频率的幅值和相位。 实现8点FFT算法的C代码如下: ```c #include <stdio.h> #include <math.h> #include <complex.h> #define N 8 void fft(complex double* signal, int n) { if (n == 1) { return; } complex double even[n / 2]; complex double odd[n / 2]; for (int i = 0; i < n / 2; i++) { even[i] = signal[2 * i]; odd[i] = signal[2 * i + 1]; } fft(even, n / 2); fft(odd, n / 2); for (int k = 0; k < n / 2; k++) { complex double t = cexp(-I * 2 * M_PI * k / n) * odd[k]; signal[k] = even[k] + t; signal[k + n / 2] = even[k] - t; } } int main() { complex double signal[N] = {1, 1, 1, 1, 0, 0, 0, 0}; fft(signal, N); for (int i = 0; i < N; i++) { printf("频率%d的幅值:%f 相位:%f\n", i, cabs(signal[i]), carg(signal[i])); } return 0; } ``` 这段代码实现了一个简单的8点FFT算法。首先定义了长度为8的复数数组signal,然后调用fft函数进行FFT计算,最后输出每个频率的幅值和相位。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值