与SQL类似的机制,用于过滤和排序对象

时间:2015-07-23 09:16:46

标签: java sql

首先,我要说的是,我在这里展示的例子非常简单,与实际情况相差甚远。然而,这个例子很好地展示了问题的核心。

我有一个班级人员

public class Person{
private int Id;
private String firstName;
private String lastName;
private Date birthDate;
private int age;
//+ getters and setters
}

我有这个类的2000个java(!)对象的列表。我的意思是我有2000人。现在我需要使用sql查询对它们进行过滤和排序。例如,我想从这些WHERE birthDate BETWEEN 1920-04-05 AND 2000-08-10 ORDER BY lastName,firstName获得这些人。

我知道sql语言是sql database.s的一部分。所以我可以将我的对象保存到mem数据库,例如H2,然后选择必要的WHEREORDER子句。然而,问题是我在这种情况下失去了性能,因为我已经有了这些对象。我需要的只是获取这些对象的ID列表,以及我得到的间隔和顺序。

所以我的问题 - 是否有任何解决方案(libs等)对java对象进行过滤和排序,包括所有常见类型?也许还有一些,甚至支持sql语言?

3 个答案:

答案 0 :(得分:6)

您可以使用 JoSQL

执行此操作
  

JoSQL SQL for Java Objects )使开发人员能够将SQL语句应用于Java对象集合。 JoSQL提供了搜索,排序和分组任何Java对象的能力,当你想对Java对象集合执行类似SQL的查询时,应该应用它。

这是您需要的查询:

SELECT id
FROM   package.Person
WHERE  toDate (birthDate) BETWEEN toDate ('1920-04-05') 
AND    toDate ('2000-08-10')

这是如何使用它:

Query q=new Query();
q.parse("SELECT id FROM   package.Person WHERE  toDate (birthDate) BETWEEN toDate ('1920-04-05') AND  toDate ('2000-08-10')");
List<?> results=q.execute(names).getResults();

修改

这是您获取此结果的方法:

List<?> results=q.execute(names).getResults();
Iterator<List> it = results.iterate();
while(it.hasNext()){
    List ls = it.next();
    System.out.println("Id: "+ls.get(0));
}

因为您会得到列表列表,因此每个列表都会包含id值。

您可以按照 JoSQL tutorial

进行操作

答案 1 :(得分:3)

http://josql.sourceforge.net/看起来有可能做到这一点。

答案 2 :(得分:1)

为什么不使用Java 8 Stream API?

 List<Integer> ids = listOfPerson.stream()
            .filter(person -> person.getBirthDate().isAfter(from) && person.getBirthDate().isBefore(to))
            .sorted(Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName))
            .map(Person::getId)
            .collect(Collectors.toList());

我相信JoSQL或其他类似的库正在使用反射,所以它不会非常高效。当你改变一个字段的名字会发生什么? 此外,在Stream API中,您可以像使用listOfPerson.parallelStream()

一样轻松地使用并行处理

了解更多信息:Use stream operations to express sophisticated data processing queries