<!-- 记录时间 --> <!-- 触发的时间是一个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>
private Timestamp date;
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
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(); }
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的日期查询格式问题,很简单,但我解决不了