如何使用JPA / hibernate创建索引,并使用mappedsupperclass中的字段和来自具体实体的字段

我有@MappedSupperClass (简化示例):

 @MappedSuperclass public abstract class MySuperClass { @Id @GeneratedValue private long id; @Column(nullable = false) private Date creationDate; // ... } 

和一个具体Entity (简化示例):

 @Entity public class MyEntity extends MySuperClass { @Index(name = "IDX_MYINDEX") @Column(nullable = false) @Enumerated(EnumType.STRING) private MyType type; @Index(name = "IDX_MYINDEX") @Column(nullable = false) @Enumerated(EnumType.STRING) private MyResult status; // ... } 

现在我需要一个索引,包括MySuperClass.creationDateMyEntity.statusMyEntity.type列。

如果我将@Index(name = "IDX_MYINDEX")添加到MySuperClass.creationDate hibernate会为从MySuperClassinheritance的每个Entity添加一个creationDate索引。

我试过@AttributeOverride但它不能用于索引。

有任何想法吗? TIA!

如果您使用的是JPA 2.1则可以使用类注释@Table及其属性索引

 @Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") }) 

请注意,正如文件所述

这些仅在表生成有效时使用。 默认为无其他索引。

如上所示, columnlist接受列名列表作为逗号分隔列表。

如果你不使用JPA 2.1,你可以使用旧的Hibernate@Index注释(注意这已被弃用)。 有一个属性columnNames ,您可以在其中传递列名称数组,无论它在哪个字段上声明。

 @Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"}) 

使用@Index注释并使用参数“columnList”来设置应该使用哪些列来创建索引。 该列表应由逗号分隔的列名值列表组成。

重要提示:不要忘记将列名属性(通过列注释)添加到创建此索引的所有属性,否则在启动容器时会出错。