我们的项目必须能够在Oracle和SQL Server中运行。问题是我们有许多HQL +本机查询,非标准运算符(即bitand和||)和函数(即SUBSTR)在Oracle中运行良好,但在SQL Server中运行不正常。
我想知道Hibernate是否能够动态地翻译它们。我认为使用HQL可能确实如此,因为它创建了一个AST,但我怀疑同样适用于本机查询。
其他问题:处理这些麻烦查询的最佳方法是什么?条件,子类化,其他......目标不是很多地修改代码。
提前完成
答案 0 :(得分:3)
为HQL使用自定义方言。而不是使用||,创建自己的名为concat的函数。然后,在SQL Server方言中将此添加到构造函数:
registerFunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", "+", ""));
您不必更改Oracle方言,因为Oracle已经具有concat函数,因此它只是通过,但对于其他函数,您可能需要在两者中注册新函数。
对于SQL查询,因为无论如何都要动态构建它们,所以可以使用基类方法,例如super.addBitAndClause(leftSide,rightSide)。
你甚至可以动态地使用方言,虽然Hibernate通过加入界面并不容易:
Dialect d = ((SessionFactoryImpl)sessionFactory).getDialect()
答案 1 :(得分:1)
我建议将HQL查询从代码移动到外部.hbm文件,并在切换数据库之前使用命名查询。正如您所说,HQL查询应该不是问题。本机查询是一个问题,您必须找到其他DBMS的等效项。但是通过将查询放入外部文件,您可以将sessionfactory配置为使用特定于数据库的.hbm文件,而不需要更改仅依赖于命名查询的代码,该查询可以是本机查询或HQL 要获取命名查询,您可以执行以下操作:
Query query = session.getNamedQuery("YourNamedHQLorSQLQuery");