我们拥有以下实体关系,其中用户属于特定组织。我的查询看起来像“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;
...
}
答案 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]
持久性提供程序必须遵守指定的顺序 列。
如果未指定
ASC
或DESC
,则ASC
(升序)为 假设
用法示例:
@Table(indexes = {
@Index(columnList = "org,type"),
@Index(columnList = "another_column")})