【问题标题】:Hibernate quick way to lookup unique string in table休眠快速查找表中唯一字符串的方法
【发布时间】:2011-02-26 04:42:46
【问题描述】:

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

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

    @Basic
    @NaturalId
    private String stringId;
}

最初我将stringId 变量设置为@Id,但结果是某些数据库(例如oracle)在通过字符串ID 检索对象时进入了full table scan;因此我改用了 long 。

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

  • 再次,用@id 注释stringId 并尝试找到解决为什么full table scans 出现在某些数据库中
  • 将字符串散列成long(同时丢失精度)并使用查找表返回与散列匹配的所有对象,然后比较它们的stringId属性是否相等以找到我们正在寻找的匹配项,例如, :

.

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

意见、建议?

[EDIT]好的,我意识到我上面的表格插图可以简单地归一化为

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

这一切都不同,因为我怀疑以下两个查询的执行大致相同:

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

【问题讨论】:

    标签: java database hibernate lookup lookup-tables


    【解决方案1】:
    1. 确保数据库中的 stringId 列上有索引

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 2011-06-30
        • 2019-12-27
        • 1970-01-01
        • 2010-10-01
        相关资源
        最近更新 更多