2

我们是否有一些 IBM pureQuery 的开源替代品来查询 Java 集合框架的内存集合或复合 Java 对象?

4

2 回答 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);
    
  • Java 的基于堆栈的查询语言 (sqbl4j)语言扩展:

    List<Product> products = getProductList();
    List<Product> expensiveInStockProducts = #{
        products 
        where unitsInStock > 0 and unitPrice > 3.00
    };
    
  • Java 对象 SQL (JoSQL)

    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等……例如,使用collecttransform

    • 谷歌番石榴

      Set<String> strings = buildSetStrings();  
      Collection<String> filteredStrings =
          Collections2.filter(strings, Predicates.containsPattern("^J"));  
      
    • 函数式Java

      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 回答