Db + Record模式Oracle数据库日期问题

波总,您好:

     之前用model.class类型转化一下map类型数据,保存没问题,但是用Db + Record模式,就发现保存说格式不对,检查了一下,是日期类型的问题(默认为String)。百度了一下,也没找到有效的办法,如何才能让Map<String, Object> map数据自动判断类型,然后可以执行Db.save("user", "sid", map),谢谢。jfinal3.4版本。

评论区

JFinal

2018-09-05 17:30

关键是你的变量类型与数据库字段类型太难猜了,实在是猜不到

foam103

2018-09-05 21:17

@JFinal 假设我已经知道Map里面那个字段名称,如何处理呢,我直接把date类型的日期放入到Map中Object里面,传过去也不行。

JFinal

2018-09-05 22:05

@foam103 还是没告诉我,你往 Model 或者 Map 里面存放的什么类型的数据,以及这个数据存到数据表中的这个表的字段类型是什么

这已经是在问第二次了

foam103

2018-09-06 09:05

@JFinal 不好意思,我在Map存放的是日期类型(当前日期),数据库表里面建立的类型也是date,其他类型按字符串形式保存没啥问题,但是oracle数据库日期就不行。我直接 map.put("UPDATE_DATE", new Date())或者map.put("UPDATE_DATE", new java.sql.Timestamp(new java.util.Date().getTime()))这样都不行。用的是Db.save这种模式的。

JFinal

2018-09-06 10:39

09-06 10:39
@foam103 出现的异常是什么,代码是怎么样的?

贴出尽可能详细的代码,以及尽可能详细的异常,否则都是在猜谜

ddjfinal

2018-09-06 16:22

请将日期转换为java.sql.Date试下

北流家园网

2018-09-06 21:48

我也遇到楼主的问题,遇到日期的,我只能自己写方法了,map中保存是java.sql.Date类型才能保存。如果比较简单的,就使用model.class。MySql就能自动识别,Oracle就不行,Oracle中的Date,可以是日期类型,也可以是日期时间类型。

@JFinal 楼主的意思是,Map是通过request直接获取的,map中当然也含有日期,应该是String类型,在使用Db.Save时,String不能自动转化为Date类型,就报错了,类型转换错误。需要从map中取出这个日期来做转换才可以,但这样做又多了一步,不适用大众方法。如果能自动识别就好了,Model.class是可以做到的了。

JFinal

2018-09-06 22:35

@北流家园网 jfinal 3.4 已经对 java.util.Date 自动转成了 java.sql.Timestamp 类型,应该是可以的,你用的哪个版本?

JFinal

2018-09-06 22:40

@北流家园网 注意看一下 OracleDialect 中的两个方法 fillStatement(...) ,转调的底层的 fillStatementHandleDateType(...) 方法,而这个方法是下面这样的:

protected void fillStatementHandleDateType(PreparedStatement pst, List paras) throws SQLException {
for (int i=0, size=paras.size(); i Object value = paras.get(i);
if (value instanceof java.util.Date) {
if (value instanceof java.sql.Date) {
pst.setDate(i + 1, (java.sql.Date)value);
} else if (value instanceof java.sql.Timestamp) {
pst.setTimestamp(i + 1, (java.sql.Timestamp)value);
} else {
// Oracle、SqlServer 中的 TIMESTAMP、DATE 支持 new Date() 给值
java.util.Date d = (java.util.Date)value;
pst.setTimestamp(i + 1, new java.sql.Timestamp(d.getTime()));
}
} else {
pst.setObject(i + 1, value);
}
}
}

也就是说,会对 java.util.Date 以及它的子类进行判断,并最终转成了:
java.sql.Date、java.sql.Timestamp 这两个类型

并且是调用的 pst.setDate(...) 与 pst.setTimestamp(...),jfinal 3.4 版本在这方面应该是万无一失的,还请大家升级到 jfinal 3.4 多多反馈

foam103

2018-09-07 10:00

@北流家园网 谢谢回复,就是你说的这个问题,oracle的日期不能用='2018-1-1' 这样的方式更新,所以默认进来的Map需要单独判断哪个字段是日期字段,然后再用new java.sql.Timestamp转一下,才能保存,这样很麻烦,因为我也不知道哪个字段是日期,最后没办法,还是用生成对象,用对象的还有一个好处就是Map如果传了很多表没有的字段,通过xxx.class对象可以过滤掉,如果直接把没处理的map给Db.save,一样也会报错。其实我之前想的是系统建好以后,不在编译,新增表的时候调用一个通用的方法处理增删改查(无事件动作),看来还不行。

jasun

2020-06-24 16:25

@JFinal
set("TC_LSR014", new java.sql.Date(memberPointParam.getCreate_time().getTime()))
保存到数据库后还是年月日时分秒格式
数据库中的类型是date, 我希望保存进去是年月日, 用的jfinal版本是4.5,请问怎么处理这个问题?

JFinal

2020-06-24 17:17

@jasun jfinal 是决然无法干预到数据库字段的类型的

说得直白点就是:你当前用的数据库,虽然是 date 类型,但仍然可以存放 "年月日时分秒"

不同的数据库对于 date 类型来说,能存的东西不一样,有的数据库只能存 "年月日", 有的可以存 "年月日时分秒"

解决办法自然就出来了:
1: 调整字段类型,使用只能存放 "年月日" 的字段
2: 无视这个问题,取数据时,只取 "年月日", "时分秒" 随它去吧

热门反馈

扫码入社