2017-01-02 61 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