我有以下自定义方言功能:
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。答案 0 :(得分:0)
嗯,这是一个超级大黑客...如果它不能为其他人解决问题,你总是可以回到以某种方式在Hibernate过滤器中更改查询的想法(参见{{3但是我并没有深入研究如何在GORM中实现它。
Hibernate不会忽视':'无论你做什么 - 它都会专门寻找那个角色。在查看QueryParameters的Hibernate代码之后,如果session.getEnabledFilters()。size()== 0,它将需要一个不会中断的代码路径(在我的情况下,我注意到我的查询与这个略有不同)无论如何都要采用该代码路径)。只启用了一个过滤器dynamicFilterEnabler。所以我在查询之前就这样做了:
sessionFactory.getCurrentSession().disableFilter('dynamicFilterEnabler')
然后在此查询后重新打开它。
我不知道那个过滤器是什么,所以我做了一些搜索,并在几张JIRA门票中找到了一些关于它的信息:
显然,当您在hasMany和belongsTo中使用相同的域对象时,这是一种解决方法。我没有这种情况,所以我能够将其关闭(暂时)。丑陋,但它现在有效。