java - Hibernate在表中查找唯一字符串的快速方法

标签 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,但事实证明,某些数据库(例如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'

最佳答案

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

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

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

关于java - Hibernate在表中查找唯一字符串的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120487/

相关文章:

java - 扩展 Hibernate 的 ResourceBundleMessageInterpolator

java - AES 生成的 key 的默认大小是多少?

java - 为什么Android中只能UI线程更新UI?

java - Jersey 中属性名称定义冲突,使用 Jackson 2.9.6

database - 仅在工作簿中打印所有电子表格名称

hibernate - 使用EclipseLink和Hibernate(JPA2.1)生成模式-忽略@ForeignKey

java - Nashorn,Java 集合,如何在纯 javascript 中实现 equals 和 hashCode

mysql - 创建存储过程时出现语法错误: 1064 ,

mysql - rails 中的多个数据库连接

java - JPA - SortedSet 需要 OrderBy