2017-01-02 44 views
1

我使用Jackcess 2.1.5從colA和colB上具有多列索引的Access 2003表中讀取數據。這可以正常工作colA colB。在Jackcess中使用多列索引以匹配第一列

現在,在理論上這種指數可以用來獲取匹配值的所有行可樂。但是如何用Jackcess做到這一點?我不能讓它使用newEntryIterableEntryIterableBuilder

Table table = access.getTable("tbl"); 
Index index = table.getIndex("index"); //index spanning two columns 
IndexCursor cursor = CursorBuilder.createCursor(index); 
for (Row row : cursor.newEntryIterable(val)) { //error: missing argument 
for (Row row : cursor.newEntryIterable(val, null)) { //returns rows where colB == null 
    //some code 
} 

工作目前我只涵蓋可樂另一個指標。這是唯一的解決方案嗎?

回答

1

我知道這有點晚,但我想添加更新。從2.1.7版本開始,Jackcess現在支持部分索引查找。所以,從原來的問題,這條線現在將尋找匹配的兩列索引的第一列其中所有條目的工作:

for (Row row : cursor.newEntryIterable(val)) { 
+1

這是個好消息,我將我的項目更新爲使用JackCess 2.1.7,效果很好。謝謝。 –

1

我只是嘗試了以下,它爲我工作。對於表命名爲 「人」

ID FirstName LastName 
-- --------- -------- 
1 Gord  Thompson 
2 Jimmy  Hoffa 
3 Jimmy  Buffett 
4 Bob  Loblaw 

名爲 「FirstLast」 上(FirstName, LastName)指數,代碼

Table tbl = db.getTable("People"); 
IndexCursor cur = CursorBuilder.createCursor(tbl.getIndex("FirstLast")); 
Map<String, String> criteria = Collections.singletonMap("FirstName", "Jimmy"); 
boolean found = cur.findFirstRow(criteria); 
if (found) { 
    boolean nextRowExists = true; 
    do { 
     Row r = cur.getCurrentRow(); 
     System.out.println(r.getString("LastName")); 
     nextRowExists = cur.moveToNextRow(); 
    } while (nextRowExists && cur.currentRowMatches(criteria)); 
} else { 
    System.out.println("(No matches found.)"); 
} 

印刷

Buffett 
Hoffa 

然而,隨後對大文件測試一個網絡共享表明,上述方法是效率低得多比使用.newEntryIterable和一個單獨的索引僅限FirstName。如果表現很重要,那麼您應該只保留colA的附加索引。

+0

這個方法返回的結果,但我認爲它不使用索引在所有。所以可能歸結爲要麼有額外的索引,要麼沒有它。 可能是JackCess的改進... –

+0

它確實使用索引來控制行的訪問順序,但我相信你是正確的,它不使用索引來幫助找到沒有掃描的第一個匹配行該表(按光標順序)。 –

+0

正確,jackcess目前不夠「智能」,不足以在使用一些初始列的多列索引上進行部分匹配。 – jtahlborn

相關問題