hibernate 3.6 : registerFunction in SQL dialect not working

标签 hibernate hql dialect

我要放弃并询问社区...

在我的项目中,我使用 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"));
    }

}

使用 hasflags HQL 查询中的方法失败。
这是查询:
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

我需要它在没有它的情况下工作,而我对它的搜索将我带到了这里。

关于 hibernate 3.6 : registerFunction in SQL dialect not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6113167/

相关文章:

java - 对于包含多个值并转换为数组的映射,正确的语法是什么

java - Hibernate findByID 实现

java - Hibernate HQL JOIN - 获取的关联不存在

c# - 关于 PostgreSQL 的 Dapper SQL 查询和参数的问题

java - 在 oracle 主要版本 11 上具有 HibernateException 的 JBOSS 部署

javascript - 如何在 node-sql 中设置 SQL 方言?

java - 如何限制hibernate criteria API获得的结果?

java - 使用启用了符合 JPA 的事务访问的 JTA 时无法访问事务

Java Hibernate 选择计数与其他列

hibernate HQL : no entity found for query