Chris Winters 不喜欢面向对象的查询API。由于Hibernate强调查询/语言/方法,我在这里不同意他。确实,Criteria查询通常比较嘈杂。我所见到的查询语言通常表达性更强。在查询语言中编写算术和逻辑表达式非常容易,但在面向对象的Criteria API中则不然。
然而,Criteria方法有一些优点。首先,有些人喜欢在编译时对查询进行更多验证。对我来说这不是什么大事,因为我非常注重单元测试。更重要的是,面向对象的查询API更适合以编程方式构建查询。字符串操作很糟糕!为所有可能的条件组合正确地得到括号和空白是一个痛苦的过程。我见过一些真正糟糕的代码,它们构建HQL字符串,而使用Criteria API则可以/更加/整洁地重写这些代码。
尤其是,新的按示例查询功能有可能将构建包含Person所需属性的查询所需的20行代码减少到
session.createCriteria(Person.class) .add( Example.create(elvis) ) .list();
好吧,我想按示例查询可能是一个有点极端的例子,你可能在查询语言中实现类似的功能。
最后,面向对象的查询API可以更方便地由用户扩展。这是我最喜欢的地方。
附言。Chris提供的代码示例对面向对象API有点不公平。Hibernate的Criteria API比这简洁得多,部分原因是它支持方法链(这在Java中几乎很少使用,因此我背叛了我与SmallTalk共度的时光)。