Sql HibernateException:命名查询中的错误

Sql HibernateException:命名查询中的错误,sql,hibernate,annotations,hibernateexception,Sql,Hibernate,Annotations,Hibernateexception,当运行特定的单元测试时,我会遇到异常: Caused by: org.hibernate.HibernateException: Errors in named queries: UPDATE_NEXT_FIRE_TIME at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:437) at org.hibernate.cfg.Configuration.buildSessionFactory(

当运行特定的单元测试时,我会遇到异常:

Caused by: org.hibernate.HibernateException: Errors in named queries: UPDATE_NEXT_FIRE_TIME
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:437)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891)
... 44 more
在尽可能深入地调试之后,我发现QueryTranslatorImpl中的w.statement(hqlAst)中出现了异常:

    private HqlSqlWalker analyze(HqlParser parser, String collectionRole) throws QueryException, RecognitionException {
    HqlSqlWalker w = new HqlSqlWalker( this, factory, parser, tokenReplacements, collectionRole );
    AST hqlAst = parser.getAST();

    // Transform the tree.
    w.statement( hqlAst );

    if ( AST_LOG.isDebugEnabled() ) {
        ASTPrinter printer = new ASTPrinter( SqlTokenTypes.class );
        AST_LOG.debug( printer.showAsString( w.getAST(), "--- SQL AST ---" ) );
    }

    w.getParseErrorHandler().throwQueryException();

    return w;
}

我的查询或注释有问题吗?

NamedQuery应该用JPQL编写,但查询似乎混合了持久属性的名称和数据库列的名称。不能在JPQL中使用数据库列的名称

在这种情况下,应使用持久属性的名称,而不是下一次点火时间。另外,
trigger\u name
看起来更像数据库列的名称,而不是持久属性的名称,但它似乎根本并没有映射到当前类中。映射后,查询如下:

update fireTime t set t.epochTime = :epochTime 
where t.triggerName = 'CalculationTrigger'
如果首选SQL查询,则应改用SQL查询

作为旁注,JPA2.0规范不鼓励更改主键:

应用程序不得更改主键的值[10]。这个 如果发生这种情况,则行为未定义。[11]

通常,实体不知道通过JPQL查询所做的更改。当尝试刷新不再存在的实体(因为主键已更改)时,这一点尤其有趣

此外,命名有点混乱:

  • 类的名称看起来更像服务类的名称 而不是实体的名称
  • 具有较低值的实体的起始名称 大写字母是相当罕见的文体
  • 实体的名称,实体的名称 表和类的名称不太匹配
  • update fireTime t set t.epochTime = :epochTime 
    where t.triggerName = 'CalculationTrigger'