@Index

@Index を使用すると、追加のインデックスを指定できます。このを使用して、一意性、関数ベースのインデックス、複合インデックス、プラットフォーム固有のインデックス、およびインデックスを並行して作成する必要があるかどうか (現在の段階では Postgres のみ) を指定できます。

@Index(unique=true)

これは、インデックスが一意であるかどうかを定義します。これは、単純な一意なインデックスだけでなく、関数ベースの一意なインデックス (例: 小文字名の一意性)、複合の一意性 (複数の列)、プラットフォーム固有の構文もサポートします。

単純なケースでは、@Column(unique=true) または @UniqueConstraint を使用することもできます。

プラットフォーム

プラットフォーム属性は、インデックスが適用される対象のデータベースプラットフォームを制限します。これを使用して、プラットフォーム固有のインデックス定義を定義できます。

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 {
  ...

上記の例では、関数ベースのインデックス lower(name) を使用する Postgres 固有のものを含む複数の @Index を指定しています。

並行

Postgres の場合、これはインデックスを並行して作成することを示します。その他のすべてのプラットフォームでは、この属性は無視されます。

定義

定義属性を使用すると、インデックスを作成するための完全な 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 が適用されるプラットフォームを指定します。