使用JPA中可能具有空值的候选键映射视图

时间:2017-08-17 15:56:44

标签: java oracle hibernate jpa

我有一个视图,其中唯一可能的候选键可能具有空值。考虑:

CREATE TABLE FOO (
    FOO_ID NUMBER(10,0),
    CONSTRAINT PK_FOO PRIMARY KEY (FOO_ID)
);

CREATE TABLE BAR (
    BAR_ID NUMBER(10,0),
    FOO_ID NUMBER(10,0),
    CONSTRAINT PK_BAR PRIMARY KEY (BAR_ID),
    CONSTRAINT FK_BAR_FOO FOREIGN KEY (FOO_ID) REFERENCES FOO(FOO_ID)
) ;

-- I'm interested in this view!
CREATE VIEW VW_FOO_BAR AS
SELECT FOO.FOO_ID, BAR.BAR_ID
FROM FOO
LEFT JOIN BAR ON FOO.FOO_ID = BAR.FOO_ID

毋庸置疑,这只是一个MCVE。实际的DDL要复杂得多。

请注意,在此视图中,BAR_ID可能是null,因为它是LEFT JOIN。但FOO_ID可能会重复多次,因此它本身不能成为关键。因此,唯一可能的候选键是(FOO_ID, BAR_ID)

无法对数据库或其视图进行任何更改。此外,此视图还有一些只能通过它访问的重要信息,因此我必须使用它。

由于它是一个视图,我永远不会对它进行插入或更新。只有查询。

问题: 有没有办法在JPA中映射此视图,而不会触发臭名昭着的“具有给定标识符的多行”异常?

废弃解决方案:

此实现可能会返回具有相同标识符的多个行,从而导致上述异常:

@Entity
@Table(name = "VW_FOO_BAR")
class VwFooBar {
    @Id
    @Column(name="FOO_ID")
    private Long idFoo;

    @Column(name="BAR_ID")
    private Long idBar
}

每当idBarnull时,此对象将返回空对象:

@Entity
@Table(name = "VW_FOO_BAR")
class VwFooBar {
    @EmbeddedId
    private VwFooBarPk pk;
}

@Embeddable
class VwFooBarPk {
    @Column(name="FOO_ID")
    private Long idFoo;

    @Column(name="BAR_ID")
    private Long idBar
}

我接受任何允许我查询视图的解决方案,如果可能的话,我更愿意避免使用纯JDBC。

我正在使用JPA 1 / Hibernate 3.3和org.hibernate.dialect.Oracle9iDialect方言。

0 个答案:

没有答案