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