我使用Jackcess 2.1.5从具有colA和colB上的多列索引的Access 2003表中读取数据。考虑到colA 和 colB的值,这样可以正常工作。
现在理论上这样的索引可用于获取与colA 仅 的值匹配的所有行。但是如何用Jackcess做到这一点?我无法使用newEntryIterable
或EntryIterableBuilder
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的索引。这是唯一的解决方案吗?
答案 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
但是,随后在网络共享中使用大型文件进行的测试表明,上述方法效率远远低于仅使用.newEntryIterable
和FirstName
上的单独索引。如果性能很重要,那么您应该仅为colA
保留该附加索引。
答案 1 :(得分:1)
我知道这有点晚了,但我想添加一个更新。截至2.1.7版本,Jackcess现在支持部分索引查找。因此,从最初的问题来看,这一行现在可用于查找在两列索引的第一列上匹配的所有条目:
for (Row row : cursor.newEntryIterable(val)) {