1

我使用 Jackcess 2.1.5 从 Access 2003 表中读取数据,该表在 colA 和 colB 上具有多列索引。给定 colAcolB 的值,这可以正常工作。

现在理论上,这样的索引可用于获取与 colA 值匹配的所有。但是如何用 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
}

目前我有另一个仅涵盖 colA 的索引。这是唯一的解决方案吗?

4

2 回答 2

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.

于 2017-01-02T20:45:23.827 回答
1

我知道这有点晚了,但我想添加一个更新。从 2.1.7 版本开始,Jackcess 现在支持部分索引查找。因此,从最初的问题来看,这一行现在将用于查找与两列索引的第一列匹配的所有条目:

for (Row row : cursor.newEntryIterable(val)) {
于 2017-05-18T03:05:44.877 回答