面向 Java 开发人员的 db4o 指南: 结构化对象和集合
2010-04-01 00:00:00 来源:WEB开发网您可能会感到奇怪,不管如何查询,返回的对象仍然是适当的子类型对象。例如,跟预期的一样,在上面的查询中当 toString() 被每个返回的 Person 对象调用时,Person.toString() 也正被每个 Person 调用。然而,因为 Employee 有一个重写的 toString() 方法,因此关于动态绑定的常用规则就不适用了。存储在 Employee 中的 Person 的各部分不会被 “切掉”,而当定期 SQL 查询未能成功地将派生子类表加入到 table-per-class 模型中时,这种被 “切掉” 的现象就会发生。
原生继承
当然,当继承条件扩展到原生查询中时,其功能就跟我所做过的简单对象查询一样强大。进行调用时,查询语法将会更加复杂,但是基本上遵循我以前所使用的语法,如清单 7 所示:
清单 7. 你是单身吗?
@Test public void testNativeQuery()
{
List<Person> spouses =
db.query(new Predicate<Person>() {
public boolean match(Person candidate) {
return (candidate.getSpouse() instanceof Employee);
}
});
for (Person spouse : spouses)
System.out.println(spouse);
}
下面的查询与我以前做过的查询在思想上类似,考虑系统中所有的 Person,但是设置一个约束条件,只查找配偶也是一个 Employee 的 Person — 调用 getSpouse(),将返回值传递给 Java instanceof 运算符,这样就完成了查询(记住 match() 调用只返回 true 或者 false,表示候选对象是否应该返回)。
请注意如何通过更改在 query() 调用中传递的 Predicate 来更改隐式选择的类型条件,如清单 8 所示:
更多精彩
赞助商链接