我有一个包含一系列唯一字符串的表,我需要提供快速查找(除了内存缓存)。
@Entity
public class UniqueString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
@NaturalId
private String stringId;
}
最初我将stringId
变量设置为@Id
,但事实证明,某些数据库(例如oracle)进入了全表扫描
通过字符串 id 检索对象时;因此我改用了 long 。
如何从字符串 stringId
快速访问 UniqueString
对象。到目前为止我看到两种解决方案:
- 再次,使用
@id
注释stringId
,并尝试找到解决方法来解决某些数据库中发生全表扫描
的问题 - 将字符串哈希为
long
(同时丢失精度)并使用查找表返回与哈希匹配的所有对象,然后比较它们的stringId
属性是否相等以查找我们正在寻找的匹配项,例如:
.
LookupTable UniqueString
+----+------+ +----+----+----------+
|hid | hash | | id |hid | stringId |
+----+------+ +----+----+----------+
| 1 | 123 | -------------> | .. | 1 | .... |
| 2 | 321 | `-----> | .. | 1 | .... |
+----+------+ +----+----+----------+
意见、建议?
[编辑] 好吧,我意识到我上面的表格插图可以简单地标准化为
UniqueString
+----+-----+----------+
| id |hash | stringId |
+----+-----+----------+
| .. | 123 | .... |
| .. | 123 | .... |
| .. | 321 | .... |
+----+-----+----------+
这使得一切都不同,因为我怀疑以下两个查询的执行效果大致相同:
来自 UniqueString,其中 hash='123'
来自 UniqueString,其中 stringId='abc'
最佳答案
确保数据库中的 stringId 列有索引
只需使用 hql 或 criteria API 查询数据库
配置查询缓存以缓存此类查询。
关于java - Hibernate在表中查找唯一字符串的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120487/