首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HibernateException:命名查询中的错误

HibernateException:命名查询中的错误
EN

Stack Overflow用户
提问于 2013-05-13 15:51:48
回答 1查看 14.3K关注 0票数 1

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

代码语言:javascript
复制
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

对于此处定义的命名查询:

代码语言:javascript
复制
@Entity(name="fireTime")
@Table(name="qrtz_triggers")
@NamedQueries({
@NamedQuery(
        name="UPDATE_NEXT_FIRE_TIME",
        query= "update fireTime t set t.next_fire_time = :epochTime where t.trigger_name = 'CalculationTrigger'")
})
public class JpaFireTimeUpdaterImpl implements FireTimeUpdater {

@Id
@Column(name="next_fire_time", insertable=true, updatable=true)
private long epochTime;

public JpaFireTimeUpdaterImpl() {}

public JpaFireTimeUpdaterImpl(final long epochTime) {
    this.epochTime = epochTime;
}

@Override
public long getEpochTime() {
    return this.epochTime;
}

public void setEpochTime(final long epochTime) {
    this.epochTime = epochTime;
}

}

在尽可能深入地调试之后,我发现异常发生在w.statement(hqlAst)中的QueryTranslatorImpl中:

代码语言:javascript
复制
    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;
}

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-13 18:47:07

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

在这种情况下,应该使用持久属性的next_fire_time名称,而不是epochTime。此外,trigger_name看起来更像数据库列的名称,而不是持久属性的名称,但它似乎根本没有映射到当前类中。映射之后,查询如下:

代码语言:javascript
复制
update fireTime t set t.epochTime = :epochTime 
where t.triggerName = 'CalculationTrigger'

如果首选SQL查询,则应该使用@NamedNativeQuery

顺便提一下,JPA2.0规范并不鼓励更改主键:

应用程序不能更改主key10的值。如果发生这种情况,则行为未定义。

一般来说,实体不知道通过JPQL查询所做的更改。当尝试刷新不再存在的实体(因为主键被更改)时,这变得特别有趣。

另外,命名也有点令人困惑:

  1. 类的名称看起来更像服务类的名称,而不是实体的名称。
  2. 以小写字母开头的实体名称是相当罕见的风格。
  3. 实体的名称、表的名称和类的名称不太匹配。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16526196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档