环境: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
2.PO里生成的映射文件(数据库采用的是MySQL,存储的数据类型是datetime)
TbRecord.java
3.这是Action里接收时间的数据类型
QueryAction.java
4.这是Dao里面的方法,用于查询
5.以下为解决办法,自写Java类将得到的数据转换成想要的格式
FormatUtils.java
问题:通过时间查询记录列表时报如下错误:
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"
οnclick="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进行接收的,没有报任何错误。可见不同的数据库差异性还是很大的。在平时学习和做项目要注意和总结这些差异。
参考资料:
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的日期查询格式问题,很简单,但我解决不了