如果无法创建外键,如何在表和实体化视图之间创建关联

时间:2019-05-30 11:15:36

标签: postgresql hibernate join criteria-api materialized-views

我有两个实体:第一个代表真实表,第二个-在PostgresSQL中的物化视图。我不能加入他们,因为Postgres不支持物化视图上的外键(无法找到它可以做的任何地方,并且我尝试过的查询都行不通)。

材料化视图具有两个字段:第一个是来自第一个表的ID,第二个是来自其他表的此ID的组合数据。我想通过ID将这两个实体连接起来,并进行查询,该查询按表中的某些数据和物化视图中的某些数据过滤记录。

要在它们上运行Criteria API查询,我想创建一个联接,但是为此,我需要在它们之间建立关联。这是一个问题,因为我无法在物化视图上创建外键来引用第一张表中的主键并以此方式创建一对一的关联。l

我应该在表和实例化视图上运行两个单独的查询,然后通过合并两个查询的结果来过滤数据吗?或者对此有更好的解决方案(例如,我仍然可以使用Criteria API在没有外键的情况下加入这两个实体)。我必须使用标准API,因为我已经使用了一组规范,并且不想重写HQL中的所有内容。

谢谢。

表实体:

@Getter
@Setter
@Entity
@Table(
    name = "node",
    uniqueConstraints = @UniqueConstraint(name = "ux_node_space_id_alias", columnNames = {"space_id", "alias"})
)
public class Node extends AbstractAuditingEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "alias", nullable = false)
    private String alias;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "description")
    private String description;


    @ManyToMany
    @JoinTable(name = "tag_node",
        joinColumns = @JoinColumn(name = "node_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id"))
    private List<Tag> tags = new ArrayList<>();

}

材料化视图:

@Entity
@Getter
@Setter
@Immutable
@Table(name = "node_document_fts")
public class FTSDocument implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    private Long id;

    @Column(name = "document")
    private String document;
}

0 个答案:

没有答案