环境:MyEclipse6.5+ Tomcat6.0.18+Struts2.1+Hibernate3.2+Spring2.5.6+MySQL Server 5.1
问题:通过时间查询记录列表时报如下错误:
ognl.MethodFailedException: Method "setDate" failed for object com.axt.po.TbRecord@1d4a34c [java.lang.NoSuchMethodException:com.axt.po.TbRecord.setDate([Ljava.lang.String;)]
1.首先看看页面上是怎么把数据传过来的
queryAllRecord.jsp
<!-- 记录时间 -->
<!-- 触发的时间是一个JS控件,用于获得时间-->
<td id="s3" style="display:none">
<s:textfield id="date" name="recordDate"
onclick="MyCalendar.SetDate(this)" cssStyle="width:150px"
readonly="true">
</s:textfield>
</td>
2.PO里生成的映射文件(数据库采用的是MySQL,存储的数据类型是datetime)
TbRecord.java
private Timestamp date;
3.这是Action里接收时间的数据类型
QueryAction.java
private String recordDate;//获取查询时间
//如果使用以下两种数据类型,就会报“ognl.MethodFailedException: Method "setDate" failed for objec”异常
//private Date recordDate;
//private Timestamp date;
public String getRecordDate() {
return recordDate;
}
public void setRecordDate(String recordDate) {
this.recordDate = recordDate;
}
System.out.println("recordDate:" + recordDate);
//2012-08-06
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(recordDate);
System.out.println(date);
//Mon Aug 06 09:41:20 CST 2012
4.这是Dao里面的方法,用于查询
TbRecordDao.java
/**
* 通过记录时间查询记录
* HQL查询 HQL查询对数据类型进行了优化,能得到正确的数据
* @param recordDate
* @return
*/
public List<TbRecord> queryRecordByDate(Date recordDate){
Query query = this.sessionFactory.openSession().createQuery("from TbRecord where date like '%"+FormatUtils.formatDateDay(recordDate)+"%'");
return query.list();
}
/**
* 通过记录时间查询记录
* 原生SQL查询 经试验证明,这种方法不可行,查询不出任何数据
* @param recordDate
* @return
*/
public List<TbRecord> queryRecordByDate(Date recordDate){
Query query = this.sessionFactory.openSession().createSQLQuery("select * from tb_record where date_format(date,'%Y-%m-%d') like '%"+cu.dateToString(recordDate)+"%'");
return query.list();
}
5.以下为解决办法,自写Java类将得到的数据转换成想要的格式
FormatUtils.java
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatUtils {
private static SimpleDateFormat second = new SimpleDateFormat(
"yy-MM-dd hh:mm:ss");
private static SimpleDateFormat day = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
/**
* 将日期格式化作为文件名
* @param date
* @return
*/
public static String formatDateForFileName(Date date) {
return fileName.format(date);
}
/**
* 格式化日期(精确到秒)
*
* @param date
* @return
*/
public static String formatDateSecond(Date date) {
return second.format(date);
}
/**
* 格式化日期(精确到天)
*
* @param date
* @return
*/
public static String formatDateDay(Date date) {
return day.format(date);
}
/**
* 将double类型的数字保留两位小数(四舍五入)
*
* @param number
* @return
*/
public static String formatNumber(double number) {
DecimalFormat df = new DecimalFormat();
df.applyPattern("#0.00");
return df.format(number);
}
/**
* 将字符串转换成日期
*
* @param date
* @return
* @throws Exception
*/
public static Date formateDate(String date) throws Exception {
return day.parse(date);
}
public static String formatDoubleNumber(double number) {
DecimalFormat df = new DecimalFormat("#");
return df.format(number);
}
}
总结:
1.页面上传过来的数据是String类型,Hibernate不能把String类型转化成TimeStamp、Date,所以在Action里不能定义成TimeStamp、Date,而定义成String,再把得到的String自写Java类转换成需要的格式。建议采用HQL查询,除非是非常复杂的SQL,这种情况建议使用原生SQL查询。
2.以前有个项目,数据库采用的是SQLServer,存储时间的类型同样是datetime,Dao里面写得没有现在那么复杂,而且Action里
是用Date进行接收的,没有报任何错误。可见不同的数据库差异性还是很大的。在平时学习和做项目要注意和总结这些差异。
参考资料:
struts2标签怎么格式化时间输出
http://www.cnblogs.com/yaohwang/archive/2012/07/05/2578567.html
http://topic.csdn.net/u/20080407/19/58c9e096-e553-42ee-af2a-a0456fe93647.html
SSH中hibernate的日期查询格式问题,很简单,但我解决不了
分享到:
相关推荐
NULL 博文链接:https://sxz20041919.iteye.com/blog/861075
ognl.MethodFailedException: Method "setUpload" failed for object 文件类型的限制会在struts.xml中进行配置 几种常见的类型,图片格式image/jpeg,image/gif word文档格式doc :application/msword word文档格式...
camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...
使用的ognl,正对是struts2 hibernate 等
ognl.jar ognl.jar
赠送jar包:ognl-3.2.21.jar; 赠送原API文档:ognl-3.2.21-javadoc.jar; 赠送源代码:ognl-3.2.21-sources.jar; 赠送Maven依赖信息文件:ognl-3.2.21.pom; 包含翻译后的API文档:ognl-3.2.21-javadoc-API文档-...
赠送jar包:ognl-3.1.12.jar; 赠送原API文档:ognl-3.1.12-javadoc.jar; 赠送源代码:ognl-3.1.12-sources.jar; 赠送Maven依赖信息文件:ognl-3.1.12.pom; 包含翻译后的API文档:ognl-3.1.12-javadoc-API文档-...
java.lang.NoClassDefFoundError: ognl/PropertyAccessor,缺少jar包,支持正则表达式
ognl-3.0.21.jar
第四章:struts2中的OGNL.ppt,详细讲解了struts2的标签使用
ognl-2.7.3.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性。 struts2-core-2.1.8.jar:Struts 2框架的核心类库 xwork-core-2.1.6.jar:XWork类库,Struts 2在其上...
ONGL官方源码
解开后才可用,再与去ECLIPSE中ATTACH SOURCE关联
ognl.jar包,struts2开发必备。用以支持OGNL表达式的。
ognl-3.0.jar:对象图导航语言(Object Graph Navigation Language),它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,...
02MyBatis概述、核心组件、OGNL.md
ognl-2.6.x.jar: 对象图导航语言(Object Graph Navigation Language),Struts2框架通过其读写对象的属性 d. freemarker-2.3.x.jar: Struts的UI标签的模板使用FreeMarker编写 e. javassist-3.x.ga.jar f. commons...
OGNL表达式的运用,能够正确运行出OGNL表达式效果,从而熟悉它的使用方法
Struts2的OGNL表达式语言Object-Graph Navigation Language