JFinal 处理Oracle的timestamp字段类型的问题

绝望的八皮 发布于 2012/07/23 15:41
阅读 2K+
收藏 8

数据库采用的Oracle 字段类型为TIMESTAMP。

当需要在页面显示这个字段的时候有个很疼的问题。oracle驱动在取出这个自动的时候类型为

oracle.sql.timestamp. 这是一个很疼的类型..它基础自oracle.sql.Datum,并没有从java中继承出来。

当我们需要用freemaker做页面展示的时候内置的函数是无法处理这个类型。

所以我们需要在取出的地方改造一下。

	List<DevInfo> list  = page.getList();
		for (DevInfo devInfo : list) {
			Object os = devInfo.get("LASTTIME");
			if ( os.getClass().getName().equals("oracle.sql.TIMESTAMP")){  
			    Class clz = os.getClass();  
			    try {
					devInfo.put("LASTTIME",  (Timestamp)  clz.getMethod("timestampValue").invoke(os));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}  
		}
		setAttr("page", page);
		render("page.html");

 

然后再freemaker模板中我们就可以正常的处理了。

 

那么这个转换的方法应该封装到哪会更好用呢?我们不可能在每一个需要的显示页面的地方都写这样的代码。

@Jfinal 有什么好的做法?

 

 

以下是问题补充:

@绝望的八皮:转换代码用这个简单一点。 for (DevInfo devInfo : list) { oracle.sql.TIMESTAMP time = devInfo.get("LASTTIME"); try { devInfo.put("LASTTIME", time.timestampValue()); } catch (SQLException e) { e.printStackTrace(); } } (2012/10/12 14:44)
加载中
2
JFinal
JFinal

    目前你的做法虽然能缓解问题,但是不优雅,当前能想到的两个方案:

1:改造 freemarker,让其认识 Oracle 的 Timestamp 类型

2:做一个 Helper 类,在此类中创建一个 public String toDate(oracle.sql.TIMESTAMP)方法,然后在界面这么用    helper.toDate(x.LASTTIME); 注意:使用 helper 类时需要先 setAttr("helper", new Helper()); 变量名可以随你自己去起, setAttr 的方式也可以你自己定,可以在拦截器,也可以在 handler 中。

    可能有更好的方案,想到后再说。

绝望的八皮
绝望的八皮
嗯,先用拦截器处理一下这个问题。
1
a
alvinte
ModelBuilder呗
1
绝望的八皮
绝望的八皮

转换那里那个方法太绕了。

直接这么就行了

 

		for (DevInfo devInfo : list) {
			oracle.sql.TIMESTAMP time = devInfo.get("LASTTIME");
			try {
				devInfo.put("LASTTIME", time.timestampValue());
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

0
鱼中鱼
鱼中鱼
model怎么样?
0
JFinal
JFinal

引用来自“alvinte”的答案

ModelBuilder呗
ModelBuilder 可能是个方向,但要避免性能损失的问题 :)
0
ww380459000
ww380459000

建议不用timestamp,用其他类型代替,凭啥给它开小灶,而且数据库显示还是那样的

绝望的八皮
绝望的八皮
那直接存整形的时间戳?
0
JFinal
JFinal

引用来自“ww380459000”的答案

建议不用timestamp,用其他类型代替,凭啥给它开小灶,而且数据库显示还是那样的

也有道理,搞特殊不太好
0
小雨0oo
小雨0oo
${entity.yourDate.dateValue()?string('yyyy-MM-dd HH:mm:ss')}
小雨0oo
小雨0oo
回复 @绝望的八皮 : ^^哈哈,也遇到了这个情况,就搜到这里了。老数据库也改不了,也懒得改源码,也不想写过滤器,所以采用了这样,哈哈
绝望的八皮
绝望的八皮
挖坟(⊙o⊙)…好叼的用法。不过我的观点是view上变量尽可能的简单,数据转化给后台。
返回顶部
顶部