繁体   English   中英

Hibernate翻译功能

[英]Hibernate translation capabilities

我们的项目必须能够在Oracle和SQL Server中运行。 问题是我们有许多HQL +本机查询,非标准运算符(即bitand和||)和函数(即SUBSTR)在Oracle中运行良好,但在SQL Server中运行不正常。

我想知道Hibernate是否能够动态地翻译它们。 我认为使用HQL可能会这样,因为它创建了一个AST,但我怀疑同样适用于本机查询。

附加问题:处理这些麻烦查询的最佳方法是什么? 条件,子类化,其他......目标不是修改代码很多。

Thanx提前

为HQL使用自定义方言。 而不是使用||,创建自己的名为concat的函数。 然后,在SQL Server方言中将此添加到构造函数:

registerFunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", "+", ""));

您不必更改Oracle方言,因为Oracle已经具有concat函数,因此它只是通过,但对于其他函数,您可能需要在两者中注册新函数。

对于SQL查询,因为无论如何都要动态构建它们,所以可以使用基类方法,例如super.addBitAndClause(leftSide,rightSide)。

你甚至可以动态地使用方言,虽然Hibernate通过加入界面并不容易:

Dialect d = ((SessionFactoryImpl)sessionFactory).getDialect()

我建议将HQL查询从代码移动到外部.hbm文件,并在切换数据库之前使用命名查询。 正如您所说,HQL查询应该不是问题。 本机查询是一个问题,您必须找到其他DBMS的等效项。 但是通过将查询放入外部文件,您可以将sessionfactory配置为使用特定于数据库的.hbm文件,而不需要更改仅依赖于可以是本机查询或HQL的命名查询的代码。命名查询您可以执行以下操作:

Query query = session.getNamedQuery("YourNamedHQLorSQLQuery");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM