107

フィールドをどのように定義しますか。たとえばemail、JPAアノテーションを使用してインデックスを作成します。emailこのフィールドには1日あたり文字通り何百万ものクエリがあり、キーがないと少し遅いため、一意でないキーをオンにする必要があります。

@Entity
@Table(name="person", 
       uniqueConstraints=@UniqueConstraint(columnNames={"code", "uid"}))
public class Person {
    // Unique on code and uid
    public String code;
    public String uid;

    public String username;
    public String name;
    public String email;
}

Hibernate固有のアノテーションを見たことがありますが、Hibernateとdatanucleusのどちらかをまだ決定しているため、ベンダー固有のソリューションを避けようとしています。

アップデート:

JPA 2.1以降、これを行うことができます。参照:アノテーション@Indexは、この場所では許可されていません

4

11 に答える 11

226

JPA 2.1を使用すると、それを実行できるはずです。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;

@Entity
@Table(name = "region",
       indexes = {@Index(name = "my_index_name",  columnList="iso_code", unique = true),
                  @Index(name = "my_index_name2", columnList="name",     unique = false)})
public class Region{

    @Column(name = "iso_code", nullable = false)
    private String isoCode;

    @Column(name = "name", nullable = false)
    private String name;

} 

更新:2つ以上の列を作成してインデックスを作成する必要がある場合は、コンマを使用できます。例えば:

@Entity
@Table(name    = "company__activity", 
       indexes = {@Index(name = "i_company_activity", columnList = "activity_id,company_id")})
public class CompanyActivity{
于 2014-03-26T11:02:23.020 に答える
38

インデックス注釈のユニークな厳選されたコレクション

=仕様=

= ORMフレームワーク=

= AndroidのORM =

=その他(分類が難しい)=

  • レルム-iOS /Android用の代替DB:アノテーションio.realm.annotations.Index;
  • Empire-db -JDBCに基づく軽量で強力なリレーショナルDB抽象化レイヤー。注釈によるスキーマ定義はありません。
  • Kotlin NoSQL (GitHub) -NoSQLデータベース(PoC)を操作するためのリアクティブでタイプセーフなDSL:???
  • Slick -Scalaのリアクティブ関数型リレーショナルマッピング。注釈によるスキーマ定義はありません。

それらの1つに行くだけです。

于 2015-04-15T12:51:29.310 に答える
32

JPA 2.1は(ついに)インデックスと外部キーのサポートを追加します!詳細については、このブログを参照してください。JPA2.1はJavaEE7の一部であり、リリースされています。

エッジでの生活が好きな場合は、Mavenリポジトリ(groupId:org.eclipse.persistence、artifactId:eclipselink、バージョン:2.5.0-SNAPSHOT)からeclipselinkの最新のスナップショットを取得できます。JPAアノテーション(2.1をサポートすると任意のプロバイダーで機能するはずです)の場合は、artifactID:javax.persistence、version:2.1.0-SNAPSHOTを使用します。

リリース後まで完成しないプロジェクトに使用していて、ひどい問題には気づいていません(あまり複雑なことはしていませんが)。

更新(2013年9月26日):現在、eclipselinkのリリースおよびリリース候補バージョンが中央(メイン)リポジトリで利用可能であるため、Mavenプロジェクトにeclipselinkリポジトリを追加する必要はありません。最新のリリースバージョンは2.5.0ですが、2.5.1-RC3も存在します。2.5.0リリースの問題のため、2.5.1 ASAPに切り替えます(modelgenのものは機能しません)。

于 2013-04-05T18:48:05.467 に答える
10

JPA 2.1では、次のことを行う必要があります

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table;

@Entity(name="TEST_PERSON")
@Table(
    name="TEST_PERSON", 
    indexes = {
       @Index(name = "PERSON_INDX_0", columnList = "age"),
       @Index(name = "PERSON_INDX_1", columnList = "fName"),
       @Index(name = "PERSON_INDX_1", columnList = "sName")  })
public class TestPerson {

    @Column(name = "age", nullable = false)
    private int age;

    @Column(name = "fName", nullable = false)
    private String firstName;

    @Column(name = "sName", nullable = false)
    private String secondName;

    @Id
    private long id;

    public TestPerson() {
    }
}

上記の例では、テーブルTEST_PERSONには3つのインデックスがあります。

  • 主キーIDの一意のインデックス

  • AGEのインデックス

  • FNAME、SNAMEの複合インデックス

注1:同じ名前の2つの@Indexアノテーションを使用すると、複合インデックスを取得できます

注2:fieldNameではなくcolumnListで列名を指定します

于 2014-10-16T15:53:58.847 に答える
5

データベースインデックスを標準化された方法で指定できるようにしたいのですが、残念ながら、これはJPA仕様の一部ではありません(おそらく、JPA仕様ではDDL生成のサポートが必要ないためです。これは、そのような機能)。

したがって、そのためにはプロバイダー固有の拡張機能に依存する必要があります。Hibernate、OpenJPA、およびEclipseLinkは、明らかにそのような拡張機能を提供します。DataNucleusを確認することはできませんが、インデックス定義はJDOの一部であるため、確認できると思います。

インデックスサポートが仕様の次のバージョンで標準化され、他の回答とどういうわけか一致しないことを本当に望んでいます。JPAにそのようなものを含めない理由はありません(特にデータベースが常に管理されているわけではないため)。最適なDDL生成サポートのため。

ちなみに、JPA2.0仕様をダウンロードすることをお勧めします。

于 2010-08-04T15:46:53.330 に答える
4

私の知る限り、インデックスを指定するためのクロスJPAプロバイダーの方法はありません。ただし、いつでもデータベースに直接手動で作成できます。ほとんどのデータベースは、クエリプランニング中に自動的にそれらを取得します。

于 2010-08-04T12:05:46.070 に答える
2

EclipseLinkは、列のインデックスを定義するためのアノテーション( @Indexなど)を提供しました。その使用例があります。例の一部が含まれています...

firstNameフィールドとlastNameフィールドには、一緒に個別にインデックスが付けられます。

@Entity
@Index(name="EMP_NAME_INDEX", columnNames={"F_NAME","L_NAME"})  // Columns indexed together
public class Employee{
    @Id
    private long id;

    @Index                      // F_NAME column indexed
    @Column(name="F_NAME")
    private String firstName;

    @Index                      // L_NAME column indexed
    @Column(name="L_NAME")
    private String lastName;
    ...
}
于 2013-03-20T21:23:26.623 に答える
1

OpenJPAを使用すると、非標準のアノテーションを指定して、プロパティのインデックスを定義できます。

詳細はこちら

于 2011-12-16T23:12:01.073 に答える
1

他の答えを要約すると:

そのうちの1つに行きます。とにかくJPA2.1に付属しているので、JPAプロバイダーを本当に切り替えたい場合に変更するのはそれほど難しくありません。

于 2013-04-08T11:18:33.117 に答える
0

JPAアノテーションを使用してこれを行うことはできません。そして、これは理にかなっています。UniqueConstraintがビジネスルールを明確に定義している場合、インデックスは検索を高速化するための単なる方法です。したがって、これは実際にはDBAによって実行される必要があります。

于 2010-08-04T12:57:43.503 に答える
0

このソリューションはEclipseLink2.5用であり、機能します(テスト済み)。

@Table(indexes = {@Index(columnList="mycol1"), @Index(columnList="mycol2")})
@Entity
public class myclass implements Serializable{
      private String mycol1;
      private String mycol2;
}

これは、昇順を前提としています。

于 2013-07-28T21:04:09.507 に答える