ストアド プロシージャの結果にマップされる 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 で選択クエリを実行すると、2 つの異なるレコードが表示されます。ただし、resultSet を繰り返し処理すると、1 つのレコードのみが 2 回表示されます。
[getMemberId()=114, getProgramId()=111]
[getMemberId()=114, getProgramId()=111]
マッピングが間違っているのか、何かを実装する必要があるのか わかりません。ところで、2 つのプロパティを使用して POJO で hashcode と equals メソッドも定義しています。
私はehcacheでHibernate 4.2.7を使用しています。データベースは DB2 です。フレームワークはSpring/Camelです。