Hibernate SqlResultSetMapping 相同的结果重复而不是唯一
Posted
技术标签:
【中文标题】Hibernate SqlResultSetMapping 相同的结果重复而不是唯一【英文标题】:Hibernate SqlResultSetMapping Same Result Repeats instead of Unique 【发布时间】:2014-12-11 05:06:44 【问题描述】:我有一个 POJO,它映射到存储过程的结果。
@NamedNativeQueries(
@NamedNativeQuery(name="Pojo.getNotification",
query="call SP_GET_NOTIFICATIONS()",
resultSetMapping = "notificationMapping",
resultClass = Pojo.class,
hints = @QueryHint(name="org.hibernate.cacheable", value="false")
)
)
@SqlResultSetMapping(name="notificationMapping",
entities =
@EntityResult(
entityClass = Pojo.class,
fields=
@FieldResult(name="memberId", column="MBR_ID"),
@FieldResult(name="programId", column="PROG_ID")
)
)
@Entity
public class Pojo
@Id
private Integer memberId;
private Integer programId;
public Integer getMemberId()
return memberId;
public void setMemberId(Integer memberId)
this.memberId = memberId;
public Integer getProgramId()
return programId;
public void setProgramId(Integer programId)
this.programId = programId;
存储过程如下所示
CREATE PROCEDURE SCHEMA.SP_GET_NOTIFICATIONS()
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN
DECLARE C2 CURSOR WITH HOLD WITH RETURN TO CLIENT FOR
SELECT DISTINCT MBR.MBR_ID AS "MBR_ID",
PROG.MBR_PGM_ID AS "PROG_ID"
FROM SCHEMA.MEMBER_TBL MBR, SCHEMA.MEMBER_PGM_TBL PROG where MBR.SOMETHING = PROG.SOMETHING;
OPEN C2;
END
我这样称呼命名的本机查询
List<?> resultSet = mySessionFactory
.getCurrentSession()
.getNamedQuery(
"Pojo.getNotification")
.setCacheable(false).setCacheMode(CacheMode.REFRESH).list();
如果我在 TOAD 中运行选择查询,我会看到两条不同的记录。但是,如果我遍历 resultSet,我只会看到一条记录出现两次:
[getMemberId()=114, getProgramId()=111]
[getMemberId()=114, getProgramId()=111]
不知道,是映射错误还是我需要实现一些东西。顺便说一句,我还使用这两个属性在 POJO 中定义了 hashcode 和 equals 方法。
我正在使用带有 ehcache 的 Hibernate 4.2.7。数据库是 DB2。框架是Spring/Camel。
【问题讨论】:
【参考方案1】:我发现这是我的@Id 注释的问题。它在成员上,确实会重复。虽然程序 ID 不会重复并且是唯一的。因此,当我将 @Id 注释放在程序上时,它的行为符合预期。万岁!!
【讨论】:
以上是关于Hibernate SqlResultSetMapping 相同的结果重复而不是唯一的主要内容,如果未能解决你的问题,请参考以下文章
Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别