JPA 制約定義を使用して部分インデックス( ) を作成したいようです。CREATE INDEX ... ON ... WHERE
これらはかなり PostgreSQL 固有のものであり、JPA によって指定されていません。それらを作成するには、ネイティブ構文を使用する必要があります。JPA がインデックス定義の機能を提供しているとは思えません。
一意の部分インデックスは一意の制約ではないため、この目的で一意の制約を使用することはできません。CONSTRAINT constraint_name UNIQUE(columns)
部分ユニーク インデックスはPostgreSQL では作成できません。PostgreSQL が一意の制約に対して一意のインデックスを作成するのは、実装の詳細にすぎません。
見る:
一部の JPA プロバイダーは、その JPA プロバイダーに固有の拡張アノテーションを提供し、ネイティブ DDL スクリプトの実行、アノテーションによるインデックスの定義などの機能を追加します。EclipseLink index DDLのドキュメントは次のとおりです。Hibernate、OpenJPA、または EclipseLink 以外のものを使用している場合、これは機能しませ ん。
JPA の標準的な回避策は、クエリを実行して起動時にこれらのインデックスの存在を確認することですpg_catalog.pg_index
。それらが見つからない場合は、EntityManager ネイティブ クエリを使用して、適切なネイティブ SQLCREATE UNIQUE INDEX
コマンドを送信します。EJB3.1@Startup @Singleton
を使用している場合、Bean はこの種のタスクに役立ちます。の構造については、PostgreSQL のドキュメントを参照してくださいpg_catalog.pg_index
。特定の名前のインデックスが存在するかどうかを確認するには、次を実行します。
SELECT EXISTS(
SELECT 1
FROM pg_index
WHERE indexrelid = 'public.indexname'::regclass
);
上記のクエリは、期待するインデックスであることを確認するために何もしないことに注意してください。ただし、追加のチェックを行うことで確認できます。pg_index
何をテストすればよいかがわかるように、インデックスを作成した後にの内容を調べるだけです。indpred
;の特定の値をチェックしようとすることはお勧めしません。null でないことを確認してください。