代码之家  ›  专栏  ›  技术社区  ›  Lluis Martinez

休眠转换功能

  •  3
  • Lluis Martinez  · 技术社区  · 15 年前

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

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

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

    提前十倍

    2 回复  |  直到 15 年前
        1
  •  3
  •   Brian Deterling    15 年前

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

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

    您不必更改Oracle方言,因为Oracle已经有了concat函数,所以它只是传递而已,但对于其他函数,您可能需要在两者中注册新函数。

    对于SQL查询,因为无论如何都是动态构建的,所以可以使用基类方法,例如super.addbitandclause(leftside,rightside)。

    您甚至可以动态地访问方言,尽管Hibernate没有通过设置接口使其变得容易:

    Dialect d = ((SessionFactoryImpl)sessionFactory).getDialect()
    
        2
  •  1
  •   tobsen    15 年前

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

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