使用Jackcess中的多列索引匹配第一列

时间:2017-01-02 18:42:44

标签: java indexing jackcess

我使用Jackcess 2.1.5从具有colA和colB上的多列索引的Access 2003表中读取数据。考虑到colA colB的值,这样可以正常工作。

现在理论上这样的索引可用于获取与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的索引。这是唯一的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我只是尝试了以下内容,它对我有用。对于名为“People”的表

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

(FirstName, LastName)上有一个名为“FirstLast”的索引,代码为

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

但是,随后在网络共享中使用大型文件进行的测试表明,上述方法效率远远低于仅使用.newEntryIterableFirstName上的单独索引。如果性能很重要,那么您应该仅为colA保留该附加索引。

答案 1 :(得分:1)

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

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