У меня есть две сущности: первая представляет реальную таблицу, а вторая - материализованное представление в 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;
}