[英]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.