一个愚蠢的错误

在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;

其中[quote]`time` [color=red]datetime[/color] default NULL,[/quote]是datetime类型的。我要做的工作就是按照一个时间段来查找记录。查询条件是
where time between startTime and endTime
即根据time字段查询。以下是我写的HQL代码:
from SystemLog sysLog where sysLog.time between :starTime and :endTime
很简单只是一执行就找不到记录,而且后台没有出错的信息。真是很隐蔽。坚持调试一天后找到题的真正原因。即:[color=blue]Hibernate配置文件中字段类型不匹配[/color]由于Hiberante配置文件中是这样描述time字段的

<property name="time" type="date"/>
即:time是date型的。[size=xx-small]注:此处的date并不是指Java中的date而是数据库的数据类型。[/size]所以,在执行上面的HQL语名时,日期中的时间部分被自动截掉,导致找不到记录,解决办法很简单把[color=red]date改成timestamp[/color]就一切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>
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页