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")会报转换错误######有啊######int id = record.getInt('id');######java.lang.Long cannot be cast to java.lang.Integer at com.jfinal.plugin.activerecord.Record.getInt(Record.java:170)######id
int(20) NOT NULL AUTO_INCREMENT 这句被你改成 id
int(5) NOT NULL AUTO_INCREMENT, 错误还在吗? 一般是 int(11)######错误还在######jfinal诸如getInt(),getDouble()和jdbc中ResultSet的getInt()不同,后者你这样用可以,他直接以int返回。但是前者实际上是(Integer)getObject()的封装,而getObject()是返回默认的类型,所以mysql int默认是返回Long类型的,你这样就错了。所以解决方法是getLong("columnname")。
######回复 @nginx困惑 : 我好像说错了,不同数据库sql类型到java类型应该是一样的,mysql 的int应该是对应java的int.bigint才是long。而且jfinal的源码上也标明了说getInt()获取mysql的int ,smallint等。######回复 @nginx困惑 : 这个不同数据库默认类型不一样的,你只能试试了。而且现在orm只是为了面向对象操作数据库,一般很少跨数据库的。你的数据库又不会变来变去。######回复 @Burning_BL :我数据库定义的是int,返回的是long,这个我取列是知道数据库类型,但像我现在遇到的问题,我只知道数据库定义是int型,但我不知道数据库返回的会不会是Long型的。######回复 @nginx困惑 : 没办法的,jfinal是这样封装的。id一般都用Long的,而且你取列的时候肯定知道是什么sql类型,然后用对应的java类型接收就行。比如如果sql是double,float,你就用Double,如果是decimal,就用BigDecimal,具体对应方式请百度。######因为我mysql数据库定义的是int类型,mysql返回long超出了我预知的范围######
mysql 数据库字段设置为 int(5),单纯取数据应该是 Integer 型,但 sql 语句可以导致这个字段值会变成 Long,例如: select sum(id).....,又如 select count(id),对 int 型字段进行运算返回了Long型值是为了防止数值溢出。
JFinal仅仅是从JDBC的ResultSet中取值,并没有对数据进行转换(Blob、Clob灰型除外),所以弄清楚JDBC返回了什么类型就可以。
贴出你的 sql 语句
######如果能够灵活转换就好。######SQL语句 : Record accountByEmail = Db.findFirst("select * from account where email=?",email);######我也遇到了,这个 record.getInt("id") 返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?######请看这里:
http://www.oschina.net/question/924197_128359
你好,我是AI助理
可以解答问题、推荐解决方案等
评论
全部评论 (0)