我们是否有一些 IBM pureQuery 的开源替代品来查询 Java 集合框架的内存集合或复合 Java 对象?
问问题
2315 次
2 回答
8
正如我的评论中提到的,我不完全确定我理解你的问题:我不确定你是否在问是否有 pureQuery 的 OSS 替代品以及 pureQuery 是否适用于 Java 集合框架的内存 DS,如果你想要一个在内存集合上工作的 OSS 替代方案,特别是 Java 集合框架。
但是,我会尝试一下...
持久层查询语言/框架
如果您正在寻找一种开源软件,用于与持久层进行基于查询的交互,显而易见的解决方案非常简单:
请注意,这些也可以用于内存数据库(如 H2 或 HSQLDb)。
集合查询语言/框架
但是,如果要查询集合,有几个项目,例如:
java 查询语言 (JQL)语言扩展:
ArrayList<String> words = dict.getWords(Puzzle.MEDIUM); ArrayList<Integer> gaplengths = puzzle.getGapLengths(); List<Object[]> matches = selectAll( String w : words, Integer i : gaplengths | w.length() == i);
-
List<Product> products = getProductList(); List<Product> expensiveInStockProducts = #{ products where unitsInStock > 0 and unitPrice > 3.00 };
-
List myObjs = getMyObjects (); Query q = new Query (); q.parse ("SELECT * FROM java.io.File WHERE name LIKE '%.java'"); QueryResults qr = q.execute (myObjs); List res = qr.getResults ();
jxpath,用于 XPath 表达式的不同方法:
Address address = (Address)JXPathContext .newContext(vendor) .getValue("locations[address/zipCode='90210']/address");
Java 的函数式编程库提供了类似的特性,因为它们使您可以访问基本的函数式构造
filter
、、、map
等……例如,使用collect
:transform
-
Set<String> strings = buildSetStrings(); Collection<String> filteredStrings = Collections2.filter(strings, Predicates.containsPattern("^J"));
-
Array<Integer> a = array(97, 44, 67, 3, 22, 90, 1, 77, 98, 1078, 6, 64, 6, 79, 42); final Array<Integer> b = a.filter(even);
拉姆达J:
// with normal interfaces: List<Person> buyersSortedByAges = sort( extract( select(sales, having(on(Sale.class).getValue(), greaterThan(50000))) ), on(Sale.class).getBuyer() ), on(Person.class).getAge()); // with fluent/chainable intefaces: List<Person> buyersSortedByAges = with(sales) .retain(having(on(Sale.class).getValue(), greaterThan(50000))) .extract(on(Sale.class).getBuyer()) .sort(on(Person.class).getAge());
-
或者,也许您只是在寻找有关使用 pureQuery 查询内存集合的教程?
于 2012-06-12T04:58:27.020 回答
2
还有 CQEngine,它支持索引和查询:CQEngine。
有关更多背景信息,请参见类似问题:How do you query object collections in Java (Criteria/SQL-like)?
于 2013-04-15T13:18:26.387 回答