在自定义方言中,我如何让Hibernate忽略冒号

时间:2013-11-01 13:25:02

标签: hibernate

我有以下自定义方言功能:

     registerFunction("weight_running_total",
       new SQLFunctionTemplate(Hibernate.STRING, "(@runtot := @runtot + weight)"))

    // This one takes an argument and saves it off in a variable named @val, that can be retrieved later in the same connection
    registerFunction("save_off_last_value",
        new SQLFunctionTemplate(Hibernate.STRING, "@val := ?1"))

但Hibernate并没有直接通过,而是抱怨冒号,并给我“无效的过滤器参数名称格式”异常。我发现其他人有这个问题,但没有看到解决方案,所以在这里寻求帮助......

顺便说一下,这是Hibernate 3(目前无法升级),b / c我正在使用Grails。

1 个答案:

答案 0 :(得分:0)

嗯,这是一个超级大黑客...如果它不能为其他人解决问题,你总是可以回到以某种方式在Hibernate过滤器中更改查询的想法(参见{{3但是我并没有深入研究如何在GORM中实现它。

Hibernate不会忽视':'无论你做什么 - 它都会专门寻找那个角色。在查看QueryParameters的Hibernate代码之后,如果session.getEnabledFilters()。size()== 0,它将需要一个不会中断的代码路径(在我的情况下,我注意到我的查询与这个略有不同)无论如何都要采用该代码路径)。只启用了一个过滤器dynamicFilterEnabler。所以我在查询之前就这样做了:

sessionFactory.getCurrentSession().disableFilter('dynamicFilterEnabler')

然后在此查询后重新打开它。

我不知道那个过滤器是什么,所以我做了一些搜索,并在几张JIRA门票中找到了一些关于它的信息:

显然,当您在hasMany和belongsTo中使用相同的域对象时,这是一种解决方法。我没有这种情况,所以我能够将其关闭(暂时)。丑陋,但它现在有效。