如何在多列上创建索引

时间:2010-09-16 10:00:35

标签: mysql hibernate orm jpa indexing

我们拥有以下实体关系,其中用户属于特定组织。我的查询看起来像“select * from User where org =:org”或“select * from User where org =:org and type =:type”

我在User类上有单独的索引。第一个查询没问题,因为外键元素上的索引。第二个查询是否在org和type列上强制执行多列索引。如果是这样,我应该如何注释来创建一个这样的索引。

@Entity 
class User {
...

@ManyToOne 
@ForeignKey
@Index
Organization org;

@Index
Type type;    
...
}

3 个答案:

答案 0 :(得分:1)

使用Hibernate特定的@Table注释是可行的。来自文档:

  

2.4.1 Entity

     

...

     

@Table(appliesTo="tableName", indexes = { @Index( name="index1", columnNames={"column1", "column2"} ) } )在表tableName的列上创建已定义的索引。这可以应用于主表或任何辅助表。 @Tables注释允许您在不同的表上应用索引。在@javax.persistence.Table@javax.persistence.SecondaryTable(s)出现的地方,预计会出现此注释。

参考

答案 1 :(得分:0)

是的,可以使用JPA 2.1,如规范中所示:

http://download.oracle.com/otndocs/jcp/persistence-2_1-pfd-spec/index.html

第445页的

表明

  

索引注释用于模式生成

     

columnList(必需)要包含在索引中的列的名称。

这里可以看到一个使用示例:

http://java-persistence-performance.blogspot.co.uk/2013/03/but-what-if-im-not-querying-by-id.html

似乎语法与Hibernate相同或非常相似。

答案 2 :(得分:0)

您可以阅读JSR-000338 Java Persistence 2.1 Proposed Final Draft Specification

  

11.1.23索引注释

     

Index注释用于模式生成。请注意,没有必要为主键指定索引,因为主键索引将自动创建,但是,索引注释可用于指定主键索引中列的排序。

     
@Target({}) @Retention(RUNTIME)
public @interface Index {
  String name() default "";
  String columnList();
  boolean unique() default false;
}
     

columnList元素的语法是column_list,如下所示:

     
column::= index_column [,index_column]*
index_column::= column_name [ASC | DESC]
     

持久性提供程序必须遵守指定的顺序   列。

     

如果未指定ASCDESC,则ASC(升序)为   假设

用法示例:

@Table(indexes = {
        @Index(columnList = "org,type"),
        @Index(columnList = "another_column")})