- 译者序
- 前言
- 本书怎么使用
- 本书排版字体约定
- 本书网站
- 致谢
- 第一部分 Hibernate 快速入门
- 第 1 章 安装和设置
- 第 2 章 映射简介
- 第 3 章 驾驭 Hibernate
- 第 4 章 集合与关联
- 第 5 章 更复杂的关联
- 第 6 章 自定义值类型
- 第 7 章 映射标注
- 第 8 章 条件查询
- 第 9 章 浅谈 HQL
- 第二部分 与其他工具的集成
- 第 10 章 将 Hibernate 连接到 MySQL
- 第 11 章 Hibernate 与 Eclipse:Hibernate Tools 使用实战
- 第 12 章 Maven 进阶
- 第 13 章 Spring 入门:Hibernate 与 Spring
- 第 14 章 画龙点睛:用 Stripes 集成 Spring 和 Hibernate
- 附录 A Hibernate 类型
- 附录 B Criteria API
- 附录 C Hibernate SQL 方言
- 附录 D Spring 事务支持
- 附录 E 参考资源
- 作者简介
- 封面介绍
面向属性的 Criteria 工厂
我们已经看到,使用 Criteria API 来表达你想要实现的查询,通常都会有多种方法,到底使用哪一种方法取决于你对系统风格的偏好或考虑问题的方式。Property 类提供了另一组替换方法,你应该对此有所了解。我们在这里不会深入研究这个类,因为它只是建立条件查询的另一种方法。不过,解释一下它的工作原理,也很重要,这样才不至于在运行许多示例时感到困惑,也不至于在浏览 Hibernate 高密度的 JavaDoc 时感觉有阻碍。(坦率地说,经过一两个示例以后,你肯定对以后会采用什么方法而有足够的想法了。)
Property 是条件查询的另一个工厂类,与 Restrictions 非常像,本章已经用过了 Restrictions(还有 Order 和 Projection,都差不多)。其实,只使用 Property 就完全可以创建其他工厂类提供的所有查询约束条件。不像前面那样是先从感兴趣的约束条件开始,再为需要使用的属性命名,Property 是先从属性开始,再挑选一个合适的约束条件。
注意:相当抽象!演示些例子吧!
和以前一样,先在想要查询的对象上创建一个 Criteria。但接下来不是用以前的方法,例如:
criteria.add(Restrictions.le("playTime",length));
而是用:
criteria.add(Property.forName("playTime").le(length));
这两条语句看起来非常像(只是侧重点稍微有些不同),就像用英语来表达同一个概念时也有多种方法一样。Property 类也提供了很多方法,用于添加约束条件、排序以及投影。不能使用 new()方法来构造一个 Property 实例,你需要使用它的 forName()静态工厂方法,或是使用一个现有的 Property 实例,再调用它的 getProperty()方法,将其转换为它的某个组成属性。
以下列举一些更复杂的例子,以演示这种方法适用的场合。原来我们使用过以下语句:
criteria.addOrder(Order.asc("name").ignoreCase());
现在可以使用以下语句:
criteria.addOrder(Property.forName("name").asc().ignoreCase());
对于投影,原来用的方法是,例如:
criteria.setProjection(Projections.max("playTime"));
与之等价的方法可以表示成:
criteria.setProjection(Property.forName("playTime").max());
注意:这简直就是财富带来的困窘!
这样,你需要从众多选择中挑选一种实现方法。有时,你正在着手解决的问题,或是代码中其他部分的难点,将决定使用某种风格的实现方式。或者,也许你只是更喜欢一种方法,就一直坚持使用这种方法了。但是,至少你现在知道了可能会遇到两种表达方法,应该能够理解任何一种条件表达式。附录 B 对所有这些工厂方法进行了总结。
选择太多了吗?没有?嗯,如果条件查询还不能很好的解决你的问题,或者你希望有一种更加强大的方法来取代本章介绍的所有选择(从本质来说,如果你更喜欢 SQL 的简洁),你就可以使用 HQL 提供的更为完整的功能。我们在下一章就会研究 HQL。
其他
在条件查询中可以悄悄用点 SQL,以便可以利用些数据库特定的功能或 DBA 技巧?使用子查询,或是通过离线(detached)查询,以便使你在一个 Hibernate session 之外创建一个查询?当执行查询时,可以插入自己的 Java 代码来过滤结果?所有这些主题,可能还有更多其他的,已经超出本书讨论的范围。如果你准备学习它们,《Java Persistence with Hibernate》( [1] )这本书的"Advanced query options"(高级查询选项)一章就提供了一个好的概览,Hibernate JavaDoc 和源代码也是不错的参考。
[1] 中文书名叫《Hibernate 实战》。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论