返回介绍

面向属性的 Criteria 工厂

发布于 2025-04-21 21:42:14 字数 1900 浏览 0 评论 0 收藏

我们已经看到,使用 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 实战》。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。