Как создать связь между таблицей и материализованным представлением, если внешний ключ не может быть создан - PullRequest
0 голосов
/ 30 мая 2019

У меня есть две сущности: первая представляет реальную таблицу, а вторая - материализованное представление в PostgresSQL.Я не могу присоединиться к ним, потому что Postgres не поддерживает внешние ключи для материализованных представлений (нигде не смог найти, что он может это сделать, и запрос, который я пробовал, не работал).

Материализованное представление имеет два поля:первая - это идентификатор из первой таблицы, а вторая - объединенные данные из других таблиц для этого идентификатора.Я хотел бы объединить эти две сущности по идентификатору и создать запрос, который фильтрует записи по некоторым данным в таблице и некоторым данным в материализованном представлении.

Для выполнения запросов 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;
}
...