一个愚蠢的错误

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

你可能感兴趣的:(数据结构,sql,xml,Hibernate,工作)