0

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

     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。

4

1 回答 1

0

好吧,这是一个超级大黑客......如果它不适用于其他人,你总是可以退回到以某种方式更改 Hibernate 过滤器中的查询的想法(请参阅我如何使用 MySQL 分配运算符( :=) 在休眠本机查询中?),但我没有深入研究如何在 GORM 中实现它。

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

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

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

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

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

于 2013-11-07T22:46:22.850 回答