开发者社区> 问答> 正文

jfinal getModel(Class) 属性超过8个就报错了!?报错

表结构如下:

create table test(
id int,
a1 varchar2(200),
a2 varchar2(200),
a3 varchar2(200),
a4 varchar2(200),
a5 varchar2(200),
a7 varchar2(200),
a8 varchar2(200),
a9 varchar2(200),
a10 varchar2(200)
)



java代码如下:
Test test = getModel(Test.class);
		test.set("id", "seq_op.nextval");
		test.save();



提示错误信息如下:
Sql: insert into test(A2, A1, A4, A3, A5, A8, A7, ID, A10) values(?, ?, ?, ?, ?, ?, ?, seq_op.nextval, ?)

2014-03-11 21:00:41
[ERROR]-[Thread: qtp20698484-19]-[com.jfinal.core.ActionHandler.handle()]: /product/saveOrUpdateProduct
com.jfinal.plugin.activerecord.ActiveRecordException: java.lang.ArrayIndexOutOfBoundsException: 8
	at com.jfinal.plugin.activerecord.Model.save(Model.java:305)
	at cn.anycall.controller.ProdeuctController.saveOrUpdateProduct(ProdeuctController.java:129)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
	at com.jfinal.aop.ActionInvocationWrapper.invoke(ActionInvocationWrapper.java:45)



如果字段少于8个,可以插入!

if (DbKit.dialect.isOracle())
pst = conn.prepareStatement(sql.toString(), new String[]{tableInfo.getPrimaryKey()});
else

在这一句报错!

展开
收起
爱吃鱼的程序员 2020-06-22 11:36:49 644 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这是oracle的bug,请下载oracle 最新的jar,连接地址: http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar

    首先,恭喜楼主问题得解,可喜可贺!

    其次,感谢楼主解决问题后的分享。

    但是我有几点建议想对楼主谏言(不喜勿看,打扰见谅):


    第一,从此问题的最终解决来看。楼主的描述实在是不足以让别人更好的帮助你解决问题。首先,你的标题和你的问题就对不上。其次,关于问题描述,最开始你只是把error的stacktrace信息发布出来,这样别人根本就无法很好的帮你判断问题,后来你对描述还更新过一次,加上了表结构和代码,但实际问题是在于oracle的驱动问题,你的描述也没有突出你用的是oracle的这个重点。为了让别人更好的帮助你,望今后把重点信息表述出来,感谢!

    第二,对于问题的解决你也没有描述清楚。首先,prepareStatement这个API的文档说明并不能说明oracle驱动的这个bug,对于问题的解决没有实际的帮助。其次,你附带的那个csdn的帖子里面也对这个bug没有任何明确的说明,而且那个帖子最后的一个回复者所述,换驱动并没有解决同样的问题,这样让读者对此bug的描述和解决难免产生质疑,缺乏可信度。虽然我又去stackoverflow确认过了,确实是oracle的jdbc驱动的问题,但是单就此问题的分享的角度,楼主的答案并没有充分体现出分享的价值。为了给大家带来更好的帮助,望楼主以后在回答的时候能给出更权威可信的答案。

    ps:我附上stackoverflow对oracle驱动bug的帖子,作为对楼主的补充,供大家参考:http://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception

    文中还描述了一种workaround的解决方案,请大家参阅。

    以上!万谢!

    大家看过来,这个才是最佳答案^_^谢谢提醒,以后多加注意!这。。。。。这个和8个有什么关系啊,直觉上感觉是你传进去的paras的size根本就不够吧。你调试看一下当时的数据是怎么样的?而且你这标题。。。是怎么回事?你这错误是在save时候的,为什么标题是说getModel的问题?你是说getModel没有给你取到9个属性么?回复 @小兵一枚:呵呵,什么要侮辱,有问题提提怎么了,不要盲目的崇拜!问题原因是oracle的bug!回复 @蚂蚁蚂蚁:不要侮辱强大的JFinal亲莫非你们都是小表!

    java.lang.ArrayIndexOutOfBoundsException: 8


    下次提问还是先检查下错误再提吧

    查了查api,如下:

    prepareStatementPreparedStatementprepareStatement(Stringsql,String[]columnNames)throwsSQLException创建一个能返回由给定数组指定的自动生成键的默认PreparedStatement对象。此数组包含目标表中列的名称,而目标表包含应该返回的自动生成键。如果SQL语句不是INSERT语句,或者SQL语言能够返回自动生成的键(这类语句的列表是特定于供应商的),则驱动程序将忽略该数组。带IN参数或不带IN参数的SQL语句都可以被预编辑并存储在PreparedStatement对象中。然后可以使用此对象多次有效地执行该语句。注:为了处理受益于预编译的带参数SQL语句,此方法进行了优化。如果驱动程序支持预编译,则prepareStatement方法将该语句发送给数据库进行预编译。一些驱动程序可能不支持预编译。在这种情况下,执行PreparedStatement对象之前无法将语句发送给数据库。这对用户没有直接影响;但它的确会影响哪些方法将抛出某些SQLException。使用返回的PreparedStatement对象创建的结果集在默认情况下类型为TYPE_FORWARD_ONLY,并带有CONCUR_READ_ONLY并发级别。已创建结果集的可保存性可调用getHoldability()确定。参数:sql-可能包含一个或多个'?'IN参数占位符的SQL语句columnNames-列名称数组,这些名称指示应该从一个或多个插入行中返回的那些列返回:一个包含预编译语句的新PreparedStatement对象,该对象能够返回由给定列名称数组指定的自动生成键抛出:SQLException-如果发生数据库访问错误,或者在关闭的连接上调用此方法SQLFeatureNotSupportedException-如果JDBC驱动程序不支持此方法



    嗯嗯,这才是正解吗感谢楼主解决问题后回来分享,此贴应该放在技术分享区哈 
    2020-06-23 11:59:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Apache Wicket User Guide - Ref 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载