首先,我要说的是,我在这里展示的例子非常简单,与实际情况相差甚远。然而,这个例子很好地展示了问题的核心。
我有一个班级人员
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,然后选择必要的WHERE
和ORDER
子句。然而,问题是我在这种情况下失去了性能,因为我已经有了这些对象。我需要的只是获取这些对象的ID列表,以及我得到的间隔和顺序。
所以我的问题 - 是否有任何解决方案(libs等)对java对象进行过滤和排序,包括所有常见类型?也许还有一些,甚至支持sql语言?
答案 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