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'