在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内部的机制,我也不太清楚,还请大家不吝赐教!