hibernate。 ClassicQueryTranslatorFactory与ASTQueryTranslatorFactory

这些查询翻译器之间有什么区别(我的意思是作为Hibernate用户的差异)。 互联网上的一些博客表示,基于ANTLR的翻译速度更快。 但我认为如果其中一个显然更好,那么Hibernate开发人员会删除另一个。 那么..有什么区别,为什么我们都有这两者? 在什么情况下我应该选择第一个还是第二个? 在什么情况下我不应该选择一位翻译?

这是一个内部hibernate配置 ; 它在升级到版本3时实现了。 除非有任何强有力的理由,否则不应该担心更改它 。 另外,对于最新版本,我认为您需要更改其默认值。 但如果你想要,你可以测试它的性能改进,如下所述。

来自Hibernate核心迁移指南:3.0 ;

查询语言更改

新的Parser – Hibernate3附带了一个全新的,基于ANTLR的HQL / SQL查询转换器。 但是,Hibernate 2.1查询解析器仍然可用。 可以通过设置Hibernate属性hibernate.query.factory_class来选择查询解析器。 可能的值是org.hibernate.hql.ast.ASTQueryTranslatorFactory,用于新的查询解析器,org.hibernate.hql.classic.ClassicQueryTranslatorFactory,用于旧的解析器。 我们正在努力使新的查询解析器支持Hibernate 2.1允许的所有查询。

但是,我们希望许多现有应用程序在迁移阶段需要使用Hibernate 2.1解析器。 不再支持Hibernate 1.x语法“来自类bar.Foo中的f”,使用“from bar.Foo as f”或“from bar.Foo f”。 不要在命名的HQL参数名称中使用点。 注意:有一个已知的错误影响使用theta样式外连接的方言(例如,OracleDialect for Oracle 8i,TimesTen方言,Sybase11Dialect)。 尝试使用支持ANSI样式连接的方言(例如Oracle9Dialect),或者如果遇到问题则回退到旧的查询解析器。

这是论坛post和关于这个问题的博客文章 。

现在回答你的问题;

有什么区别,为什么我们两个都有?

正如在更改日志中所说,hibernate 3用ClassicQueryTranslatorFactory替换了ASTQueryTranslatorFactory 。 这是一个内部更改,在更改破坏您的应用程序之前,用户无需对其进行操作。

在什么情况下我应该选择第一个还是第二个?在什么情况下我不应该选择一个翻译?

默认情况下启用ASTQueryTranslatorFactory ,只有在升级到版本3时任何查询中断时才应考虑更改它。

再一次,这是一个过去的故事(2006年左右); 最新版本的hibernate是4.1,查询翻译器现在必须稳定。 因此99%你不需要改变任何东西。