Session.createCriteria(表类namw)检索重复行的criteria方法



我们使用session.createCriteria(HLink.class)方法从表中检索记录,但它正在提取列表中的重复记录。

当我在列表对象中看到它显示表中第一行的重复记录时。

下面是休眠映射文件

<hibernate-mapping package="com.stockmann.framework.service.hierarchy">
<class name="HLink" table="STOCKMANN.HLINK" lazy="true">
<composite-id>
<key-property name="linkId" column="LINKID" type="integer"/>
<key-property name="fromHierarchy" column="FROMHIERARCHY" type="integer"/>
<key-property name="fromNode" column="FROMNODE" type="integer"/>
</composite-id>
<property name="toHierarchy" column="TOHIERARCHY" type="integer"/>
<property name="toNode" column="TONODE" type="integer"/>
</class>
</hibernate-mapping> 

当我在数据库中尝试查询时,它返回了正确的记录。

select * 
from stockmann.hlink 
where LINKID = 130 
and FROMHIERARCHY = 1 
and FROMNODE = 3743 
and TOHIERARCHY = 30;

记录为:

130 1   3743    30  8
130 1   3743    30  186
130 1   3743    30  190

但当我在java中的List对象中看到它时,它显示如下:

List object :[
com.stockmann.framework.service.hierarchy.HLink@695fc665[linkId=130,fromHierarchy=1,fromNode=3743,toHierarchy=30,toNode=8],
com.stockmann.framework.service.hierarchy.HLink@695fc665[linkId=130,fromHierarchy=1,fromNode=3743,toHierarchy=30,toNode=8],
com.stockmann.framework.service.hierarchy.HLink@695fc665[linkId=130,fromHierarchy=1,fromNode=3743,toHierarchy=30,toNode=8]
]

请帮我从表中获取实际记录,而不是一个重复记录。

您的表或映射中存在设计缺陷。

您的映射显示,{LINKID, FROMHIERARCHY, FROMNODE}是HLink实体的主键(PK)。但相比之下,您的模式允许插入多个具有相同{LINKID, FROMHIERARCHY, FROMNODE}组合的共同记录,正如原始SQL查询响应所证明的那样。您应该为{LINKID, FROMHIERARCHY, FROMNODE}定义一个唯一的索引或主键。

或者,你也不要对Hibernate撒谎,告诉她这是一把主键——事实并非如此。

为什么实体会重复?

当Hibernte读取SQL查询响应时,对于具有不同PK值的每一行,它都会实例化一个新的HLink实体对象。Hibernate读取130 1 3743 30 8,并为新发现的PK元组{130, 1, 3743}创建一个实例,将该实体实例放入会话l1缓存。对于这两个附加记录,Hibernate都识别出"哦,我已经在缓存中有了PK{130, 1, 3743}的实体,所以我不需要检查完整的结果记录,只需将缓存的实例再次添加到查询结果列表中"。

编辑:

要解决此问题,您可以将PK添加到表结构中并将其映射为@Id,也可以找到唯一的列组合并将其映像为复合id,就像您对非唯一列组合所做的那样。正如这个问题的答案所说,如果没有Id,Hibernate似乎就无法工作。

最新更新