在 Jackcess 中使用多列索引匹配第一列
using multicolumn index in Jackcess to match on first column
我使用 Jackcess 2.1.5 从 Access 2003 table 读取数据,在 colA 和 colB 上有一个多列索引。这在给定 colA and colB.
值的情况下工作正常
现在理论上这样的索引可用于获取与 colA only 的值匹配的所有行。但是如何用 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 的索引。这是唯一的解决方案吗?
我刚刚尝试了以下方法,它对我有用。对于名为 "People"
的 table
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
.
保留该附加索引
我知道这有点晚了,但我想添加一个更新。从 2.1.7 版本开始,Jackcess 现在支持部分索引查找。因此,从最初的问题来看,这一行现在将用于查找与双列索引的第一列匹配的所有条目:
for (Row row : cursor.newEntryIterable(val)) {
我使用 Jackcess 2.1.5 从 Access 2003 table 读取数据,在 colA 和 colB 上有一个多列索引。这在给定 colA and colB.
值的情况下工作正常现在理论上这样的索引可用于获取与 colA only 的值匹配的所有行。但是如何用 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 的索引。这是唯一的解决方案吗?
我刚刚尝试了以下方法,它对我有用。对于名为 "People"
的 tableID 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
.
我知道这有点晚了,但我想添加一个更新。从 2.1.7 版本开始,Jackcess 现在支持部分索引查找。因此,从最初的问题来看,这一行现在将用于查找与双列索引的第一列匹配的所有条目:
for (Row row : cursor.newEntryIterable(val)) {