2008-07-01

一个愚蠢的错误

关键字: 告诫自己要仔细
在Hibernate使用中我犯了一个严重的低级错误,就是把字段的映射类型写错了,一个及其隐蔽的错误,真是害人不潜呀。下面把Hiberante映射文件展示如下:
	<class name = "SystemLog" table="SS_SysLog" dynamic-insert="false" dynamic-update="true">
		<id name ="id" column = "ID" type ="integer">
			<generator class="native"/>
		</id>
		<property name="data" type="date"/>
		<property name="time" type="date"/>
		<property name="level" type="string" length="10"/>
		<property name="message" type="text"/>
	</class>

以上是一个错误的映射文件。我的数据表结构是这样定义的:
CREATE TABLE `ss_syslog` (
  `id` int(11) NOT NULL auto_increment,
  `data` date default NULL,
  `time` datetime default NULL,
  `level` varchar(10) character set gb2312 default NULL,
  `message` mediumtext character set gb2312,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT;

其中
引用
`time` datetime default NULL,
是datetime类型的。我要做的工作就是按照一个时间段来查找记录。查询条件是
where time between startTime and endTime
即根据time字段查询。以下是我写的HQL代码:
from SystemLog sysLog where sysLog.time between :starTime and :endTime
很简单只是一执行就找不到记录,而且后台没有出错的信息。真是很隐蔽。坚持调试一天后找到题的真正原因。即:Hibernate配置文件中字段类型不匹配由于Hiberante配置文件中是这样描述time字段的
<property name="time" type="date"/>
即:time是date型的。注:此处的date并不是指Java中的date而是数据库的数据类型。所以,在执行上面的HQL语名时,日期中的时间部分被自动截掉,导致找不到记录,解决办法很简单把date改成timestamp就一切OK了。哈哈。
以下是改后的XML文件:
	<class name = "SystemLog" table="SS_SysLog" dynamic-insert="false" dynamic-update="true">
		<id name ="id" column = "ID" type ="integer">
			<generator class="native"/>
		</id>
		<property name="data" type="date"/>
		<property name="time" type="timestamp"/>
		<property name="level" type="string" length="10"/>
		<property name="message" type="text"/>
	</class>
评论
发表评论

您还没有登录,请登录后发表评论

techno_it
搜索本博客
博客分类
最近加入圈子
存档
最新评论