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%你不需要改变任何东西。