当前位置: 首页 > 面试题库 >

Hibernate 3.6:SQL方言中的registerFunction无法正常工作

陈文景
2023-03-14
问题内容

我放弃了,问社区…

在我的项目中,我使用的是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

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



 类似资料:
  • 问题内容: 给我这个: 为什么不: @JosephPla您明白了,谢谢。如何排序数字之类的字符串? 问题答案: 尝试 但是您应该研究将列类型更改为正确的类型。

  • 问题内容: 我是JSP的新手,正在使用表达语言。我将Eclipse Galileo与版本2.5和Tomcat 6服务器一起使用。我只想问一下我的简单表达语言是否不会像我写的那样打印出淡淡的文字,假设它给出了false,但仅在呈现页面时才显示 。但是,当我使用它正确打印错误。我认为标签库存在问题。请为我建议原因,我为此提供了示例代码,以便你了解我要去哪里: 根据答案进行更新,这里是更多信息: 我正在

  • 问题内容: 这个问题已经在这里有了答案 : MySQL中的CHECK约束不起作用 (8个答案) 2年前关闭。 我创建了带有检查约束的表计划: 当我插入违反检查约束的值时,sql报告没有错误。 我插入了一个在order_date之前的dely_date。 问题答案: 与中的约束一样被忽略 工作的实施例使用: LiveDemo 您可以使用触发器进行验证: SqlFiddleDemo

  • 问题内容: 我不明白为什么使用此正则表达式该方法返回false; 我是一个字边界的字符! 问题答案: 在Java中,尝试将模式与 整个string 进行匹配。 这是真实的,和。 如果要检查字符串中是否有匹配项,可以使用。在这种情况下,它是Java字符串文字。 API链接 :尝试根据图案匹配整个区域。 什么意思 如此处所用,点是一个正则表达式元字符,表示(几乎)任何字符。是一个正则表达式元字符,表示

  • 问题内容: 我有以下两个表 地块表 动作表 我想查找记录,但没有 这是我的查询 结果是 我要4号和5号包裹 问题答案: 请,在任何常用数据库产品中的AND运算符中都很难找到一个简单的错误。这里的问题不是数据库引擎没有产生正确的结果,而是您不了解AND运算符的作用。 看你的病情。将会发生的是,引擎将检查输出中的每个可能的行,并确定它是否满足您指定的条件。那么,对于第一行,采取的动作是否为“已接收”,

  • 问题内容: 我有一个问题,但我无法解决。 我得到的输出是$ FB和$ F,但是此虚拟字符串仅包含列表中的一个字符串..是否还有其他方法可以完全匹配? 问题答案: 您似乎想查看是否包含一个 单词 。你可以这样做: