使用 JPA 指定索引(非唯一键)精心挑选的独特索引批注集合

2022-08-31 09:48:16

如何定义字段,例如使用JPA注释作为索引。我们需要一个非唯一键,因为每天有数百万个查询在这个字段上,如果没有键,它有点慢。emailemail

@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;
}

我已经看到了一个休眠特定的注释,但我试图避免供应商特定的解决方案,因为我们仍在休眠和数据核之间做出决定。

更新:

从 JPA 2.1 开始,您可以执行此操作。请参见: 不允许使用此位置使用批注@Index


答案 1

使用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;

} 

更新:如果您需要使用两列或更多列创建和索引,则可以使用逗号。例如:

@Entity
@Table(name    = "company__activity", 
       indexes = {@Index(name = "i_company_activity", columnList = "activity_id,company_id")})
public class CompanyActivity{

答案 2

精心挑选的独特索引批注集合

= 规格 =

= 奥姆框架 =

= ORM for Android =

=其他(难以分类)=

  • Realm - Alternative DB for iOS / Android: Annotation io.realm.annotations.Index;
  • Empire-db - 一个基于JDBC的轻量级但功能强大的关系数据库抽象层。它没有通过注释的模式定义;
  • Kotlin NoSQL (GitHub) - 一种反应式和类型安全的DSL,用于处理NoSQL数据库(PoC):???
  • Slick - Scala的Reactive Functional Relational Mapping。它没有通过批注的架构定义。

只要去找一个。


推荐