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