@Index

使用 @Index,我们可以指定其他索引。我们可以使用它指定唯一性、基于函数的索引、复合索引、特定于平台的索引以及是否应同时创建索引(目前仅限于 Postgres)。

@Index(unique=true)

这定义了索引是否为唯一。这支持简单的唯一索引,也支持基于函数的唯一索引(例如,唯一的较低名称)、复合唯一性(多列)和特定于平台的语法。

对于简单的情况,我们也可以使用 @Column(unique=true)@UniqueConstraint

平台

platforms 属性限制了索引应应用到的数据库平台。我们使用它来定义特定于平台的索引定义。

我们还可以通过 extra-dll.xml 为索引指定特定于平台的 DDL。

@Index(platforms = Platform.H2, unique = true, columnNames = {"name"})
@Index(platforms = Platform.POSTGRES, unique = true, name = "uq_printer_name", columnNames = {"lower(name)"})
@Entity
@Table(name = "printers")
public class DPrinter extends Model {
  ...

在上面的示例中,我们指定了多个 @Index,其中特定于 Postgres 的一个使用基于函数的索引 lower(name)

并发

对于 Postgres,这表示应同时创建索引。对于所有其他平台,此属性将被忽略。

定义

definition 属性允许我们指定用于创建索引的完整 DDL。当我们这样做时,我们应该指定索引名称以支持删除索引。

@Index(
  platforms = Platform.POSTGRES,
  name = "ix_detail_lowername",
  definition = "create index ix_detail_lowername on t_detail using hash (lower(name)) where lower(name) like 'r%'")

通常,此索引 DDL 将特定于平台,如果我们针对多个数据库平台进行测试,我们将指定索引 DDL 所应用的平台。