Hibernate快速查找表中的唯一字符串

时间:2011-02-25 17:25:08

标签: java database hibernate lookup lookup-tables

我的表包含一系列独特的字符串,我需要提供快速查找(除了内存缓存)。

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

    @Basic
    @NaturalId
    private String stringId;
}

最初我将stringId变量设为@Id,但事实证明,当按字符串ID检索对象时,某些数据库(例如oracle)进入full table scan;因此我改为长。

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

  • 再次使用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'

2 个答案:

答案 0 :(得分:4)

  1. 确保数据库中stringId列的索引

  2. 只需使用hql或条件API查询数据库

  3. 配置查询缓存以缓存此类查询。

答案 1 :(得分:1)

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