解决方法:hql查询无主键表中的数据,返回的结果全是一样的!

在oracle中定义了表titlerecord,其中没有主键,测试数据两条:

001 房门 管理学院 博士 教授 2011-04-12  2011-04-15
001 房门 管理学院 博士 讲师 2009-02-14  2009-02-20

在daoImpl层写查询hql语句

String hql = "from TitleRecord t where t.personNum = ?";
Query query = session.createQuery(hql);
query.setString(0, personNum);
查询出来的结果为:

001 房门 管理学院 博士 教授 2011-04-12  2011-04-15

001 房门 管理学院 博士 教授 2011-04-12  2011-04-15

记录的数目是对的,但是查出来的结果都是一样的。

解决办法:

在映射文件.hbm.xml中定义为联合主键,即用<composite-id>

<composite-id>
	<key-property name="personNum" type="java.lang.String">
	      <column name="PERSONNUM" />
	</key-property>
	<key-property name="personName" type="java.lang.String">
	      <column name="PERSONNAME" />
	</key-property>
	<key-property name="workDepart" type="java.lang.String">
	      <column name="WORKDEPART" />
	</key-property>
	<key-property name="education" type="java.lang.String">
	      <column name="EDUCATION" />
	</key-property>
	<key-property name="title" type="java.lang.String">
	      <column name="TITLE" />
	</key-property>
	<key-property name="titleAccessTime" type="java.util.Date">
	      <column name="TITLEACCESSTIME" length="7" />
	</key-property>
	<key-property name="titleAccessNum" type="java.lang.String">
	      <column name="TITLEACCESSNUM" />
	</key-property>
	<key-property name="effectTime" type="java.util.Date">
	      <column name="EFFECTTIME" length="7" />
	</key-property>
</composite-id>
重新部署,但是报错:composite-id class must implement Serializable

使用联合主键时,bean类必须序列化

import java.io.Serializable;

public classBean implements Serializable {}

最终查询结果正确


至于为什么要使用联合主键,可能是hibernate内部的机制,我也不太清楚,还请大家不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值