Oracle数据库中表的字段设置为:date类型(这里我不需要时间,因此采用了date型,如果需要时间似乎应采用timestamp类型);
模型层表对应的pojo类及hibernate映射文件中属性的类型为java.util.Date;
表现层采用Dorado处理,dataset中相应的字段也设置为:date类型;
利用MyEclipse中自带的hibernate逆向工程自动生成DAO类。
在通过以上配置调用DAO中的方法,进行以date类型属性作为查询条件进行查询时,会产生以下错误:
ORA-01858: 在要求输入数字处找到非数字字符
个人认为是由于date类型的格式问题导致的,即查询条件中的日期格式与数据库中的格式不一致。因为可以看到,由表现层传到BO层的Date对象为:“Wed Jul 28 13:09:40 CST 2010 ”,而数据库中存储的为:“2010-7-28”,所以考虑转换时间格式。
我采用了以下方法处理该问题:
1、在DAO类中添加利用该属性检索实例的查询方法
public List findByFailueDate (String FailueDate) {
log.debug("finding by FailueDate");
try {
String queryString = "from MachineMaintenance as mm where mm.failureTime = to_date('"+FailueDate+"','yyyy-mm-dd')";
List list = new ArrayList();
list = getHibernateTemplate().find(queryString);
return list;
} catch (RuntimeException re) {
log.error("find by FailueDate failed", re);
throw re;
}
}
to_date为oracle中的函数,要特别注意的是如果需要时间,那么to_date中的参数应为:“yyyy-mm-dd hh-mi-ss”,因为oracle中不区分大小写的,所以分钟不应该用mm,而改为mi。
可以看到该查询方法的形参为String型而不是Date型。
2、在BO处理类中,得到界面层传入的Date对象d(println输出为:“Wed Jul 28 13:09:40 CST 2010 ”),通过SimpleDateFormat将d转化为String类型的date对象:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(d);
List list = xxxxDAO.findByFailueDate(date);
3、而后将date作为参数,调用DAO中的方法进行查询。顺利得到了想要得到的查询结果。
请各位高手多多指教啊,我是菜鸟,可能处理上走了很多弯路,不过总算是自己走通了,虽然方法笨了点儿。