休眠3.6:SQL语言中的registerFunction不起作用

问题描述

| 我放弃了,问社区... 在我的项目中,我使用的是Hibernate 3.6.4.Final和自定义sql方言:
public class ServiceAppMysqL5InnoDBDialect extends MysqL5InnoDBDialect {

    public ServiceAppMysqL5InnoDBDialect() {
        super();
        registerFunction(\"bitwise_and\",new sqlFunctionTemplate(StandardBasicTypes.INTEGER,\"(?1 & ?2)\"));
        registerFunction(\"hasflags\",new sqlFunctionTemplate(StandardBasicTypes.BOOLEAN,\"?1 & ?2 = ?2\"));
    }

}
在HQL查询中使用
hasflags
方法失败。 这是查询
Query q = em
        .createquery(
            \"SELECT o FROM \"
            + entityClass.getName()
            + \" o WHERE hasflags(o.status,:status) AND o.email = :email\")
        .setParameter(\"email\",username)
        .setParameter(\"status\",status.getBitmask());
错误
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: ( near line 1,column 50 [SELECT o FROM tv.px.domain.Owner o WHERE hasflags(o.status,:status) AND o.email = :email]
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createquery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createquery(SessionImpl.java:1770)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createquery(AbstractEntityManagerImpl.java:272)
因此,似乎该功能未正确注册。我已经使用较旧的Hibernate版本完成了几次,并且一直都以这种方式工作。 以防万一有人问:是的,我将Hibernate配置为使用方言:
<persistence-unit name=\"persistenceUnit\"
    transaction-type=\"RESOURCE_LOCAL\">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name=\"hibernate.dialect\" value=\"tv.px.persistence.hibernate.ServiceAppMysqL5InnoDBDialect\" />

        <!-- and so on -->
    </properties>
</persistence-unit>
编辑:在SELECT子句中,我可以使用已注册函数而不会出现问题,但不能在WHERE子句中使用。     

解决方法

我有一个类似的问题。如果将where子句修改为:
hasflags(o.status,:status) = true
我需要它在没有它的情况下工作,而对它的搜索将我带到了这里。