2011-02-25 90 views
0

我有一个包含一系列唯一字符串的表,我需要提供快速查找(除了内存缓存)。Hibernate快速查找表中唯一字符串的方法

@Entity 
public class UniqueString { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Basic 
    @NaturalId 
    private String stringId; 
} 

最初我有stringId变量作为@Id,但事实证明,某些数据库(例如,Oracle)的检索由字符串ID的对象时进入full table scan;因此我转而选择了很长一段时间。

如何从字符串stringId快速访问UniqueString对象。我看到了两个解决方案,到目前为止:

  • 同样,注释stringId@id,并试图解释为什么会出现在一些数据库full table scans
  • 哈希串入一个long(而失去精度),以找到一个解决并使用查找表返回匹配散列的所有对象,然后比较它们的stringId属性是否相等以找到我们正在寻找的匹配项,例如:

LookupTable     UniqueString 
+----+------+    +----+----+----------+ 
|hid | hash |    | id |hid | stringId | 
+----+------+    +----+----+----------+ 
| 1 | 123 | -------------> | .. | 1 | .... | 
| 2 | 321 |  `-----> | .. | 1 | .... | 
+----+------+    +----+----+----------+ 

意见,建议?

[编辑]好吧,我认识到,我的上表说明可以简单地归到

UniqueString 
+----+-----+----------+ 
| id |hash | stringId | 
+----+-----+----------+ 
| .. | 123 | .... | 
| .. | 123 | .... | 
| .. | 321 | .... | 
+----+-----+----------+ 

这使得所有的差异,因为我怀疑下面两个查询将执行大致相同:

  • from UniqueString where hash='123'
  • from UniqueString where stringId='abc'

回答

4
  1. 确保有数据库

  2. 上的StringID科拉姆指数只用HQL或条件API

  3. 配置您的查询缓存缓存这种类型的查询查询数据库。

1

这是关于如何保留数据库中的所述列的更多信息。我认为正确的方法是在列上定义散列索引并将实体中的字段标记为索引。

相关问题