2011-02-25 97 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

這是關於如何保留數據庫中的所述列的更多信息。我認爲正確的方法是在列上定義散列索引並將實體中的字段標記爲索引。

相關問題