Java Jackcess 通过多于一列查找行
Posted
技术标签:
【中文标题】Java Jackcess 通过多于一列查找行【英文标题】:Java Jackcess Find Row by More than one column 【发布时间】:2014-08-05 11:00:36 【问题描述】:我正在使用 Jackcess 库访问 Java 上的 MS Access 数据库,我想知道如何通过多个列值查找表行。
到目前为止,每次我需要逐列查找一行值时,我都遵循此过程:
Row row = CursorBuilder.findRow(table, Collections.singletonMap("a", "foo"));
if(row != null)
System.out.println("Found row where 'a' == 'foo': " + row);
else
System.out.println("Could not find row where 'a' == 'foo'");
我在 Jackcess 网站上找到了这个,它的作用类似于“SELECT * FROM tablename WHERE a = “foo”。 我需要的是拥有多个“WHERE-Condition”。
根据我在 Jackcess 上阅读的文档,FindRowByPrimaryKey 或 FindRowByEntry 似乎可以满足我的需求,但我发现的示例仅表明它适用于一种条件。
http://jackcess.sourceforge.net/apidocs/com/healthmarketscience/jackcess/IndexCursor.html#findRowByEntry%28java.lang.Object...%29
第二个参数称为entryValues(复数),但我不知道如何使用它。
提前致谢
【问题讨论】:
【参考方案1】:您可以通过为 entryValues 创建具有多个条目的 Map
来指定多个条件,如下所示:
Database db = DatabaseBuilder.open(new File(
"C:/Users/Gord/Desktop/Database1.accdb"));
Table table = db.getTable("People");
Map<String, Object> criteria = new HashMap<String, Object>();
criteria.put("FirstName", "Jimmy");
criteria.put("LastName", "Hoffa");
Row row = CursorBuilder.findRow(table, criteria);
if (row == null)
System.out.println("No row found that matches all criteria.");
else
System.out.println(String.format("Row found: ID=%d.", row.get("ID")));
这将找到与所有指定条件匹配的行(如... WHERE FirstName='Jimmy' AND LastName='Hoffa'
)。要使用更复杂的搜索条件,您可以考虑使用UCanAccess(详情here)。
【讨论】:
谢谢,这正是我所需要的。我确实尝试过使用 UCanAccess,但我发现它的执行速度比常规的 jackess 实现要慢得多。至少这就是发生在我身上的事情......再次感谢! 一般来说,你不应该有 ucanaccess 的性能问题,特别是如果你可以在内存工作模式下使用默认值 (memory=true)。但请注意,vm 进程生命周期中第一次连接的时间实际上可能很慢(主要取决于数据库大小)。相反,查询时间应该非常快。以上是关于Java Jackcess 通过多于一列查找行的主要内容,如果未能解决你的问题,请参考以下文章