JFinal Record 取的数据库类型与实际不符? 400 报错
@JFinal JFinal 1.3 版本, 有一张mysql 表,定义的字段 id 为 int 型,是数据库的关键字段和自增长字段
CREATE TABLE `account` ( `id` int(5) NOT NULL AUTO_INCREMENT, `email` varchar(30) DEFAULT NULL, )
在使用 record.get("id") 取出来的id 类型是long型,导致转换出错.
public static String generateActivateLink(Record record) { int id = record.get("id"); }
存储record的代码如下
Record account = new Record(); account.set("email", email).set("password", encrypt_password) .set("name", name).set("sex", sex).set("city", city) .set("date_join", date_join).set("last_login", last_login) .set("online", true) .set("activate", CareConst.ACCOUNT_STATUS_DEACTIVATE) .set("randomCode", UUID.randomUUID()); Db.save("account", account);
Record应该有一个getInt()方法就好,不知道有没有######record.getInt("id")会报转换错误######有啊######intid=record.getInt('id');######java.lang.Longcannotbecasttojava.lang.Integeratcom.jfinal.plugin.activerecord.Record.getInt(Record.java:170)######id
int(20)NOTNULLAUTO_INCREMENT这句被你改成id
int(5)NOTNULLAUTO_INCREMENT,错误还在吗? 一般是int(11)######错误还在######jfinal诸如getInt(),getDouble()和jdbc中ResultSet的getInt()不同,后者你这样用可以,他直接以int返回。但是前者实际上是(Integer)getObject()的封装,而getObject()是返回默认的类型,所以mysqlint默认是返回Long类型的,你这样就错了。所以解决方法是getLong("columnname")。
######回复<aclass="referer"target="_blank">@nginx困惑:我好像说错了,不同数据库sql类型到java类型应该是一样的,mysql的int应该是对应java的int.bigint才是long。而且jfinal的源码上也标明了说getInt()获取mysql的int,smallint等。######回复<aclass="referer"target="_blank">@nginx困惑:这个不同数据库默认类型不一样的,你只能试试了。而且现在orm只是为了面向对象操作数据库,一般很少跨数据库的。你的数据库又不会变来变去。######回复<aclass="referer"target="_blank">@Burning_BL:我数据库定义的是int,返回的是long,这个我取列是知道数据库类型,但像我现在遇到的问题,我只知道数据库定义是int型,但我不知道数据库返回的会不会是Long型的。######回复<aclass="referer"target="_blank">@nginx困惑:没办法的,jfinal是这样封装的。id一般都用Long的,而且你取列的时候肯定知道是什么sql类型,然后用对应的java类型接收就行。比如如果sql是double,float,你就用Double,如果是decimal,就用BigDecimal,具体对应方式请百度。######因为我mysql数据库定义的是int类型,mysql返回long超出了我预知的范围######
mysql数据库字段设置为int(5),单纯取数据应该是Integer型,但sql语句可以导致这个字段值会变成Long,例如:selectsum(id).....,又如selectcount(id),对int型字段进行运算返回了Long型值是为了防止数值溢出。
JFinal仅仅是从JDBC的ResultSet中取值,并没有对数据进行转换(Blob、Clob灰型除外),所以弄清楚JDBC返回了什么类型就可以。
贴出你的sql语句
######如果能够灵活转换就好。######SQL语句:RecordaccountByEmail=Db.findFirst("select*fromaccountwhereemail=?",email);######我也遇到了,这个<spanstyle="color:#FF6600;font-family:微软雅黑,Verdana,sans-serif,宋体;line-height:normal;background-color:#FFFFFF;">record.getInt("id")返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?######<divclass="ref">请看这里:
<arel="nofollow">http://www.oschina.net/question/924197_128359
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。