HibernateException: Erreurs dans la requête nommée
Lors de l'exécution d'une unité de test, je suis l'exception:
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
pour la requête nommée défini ici:
@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;
}
}
Après le débogage aussi profond que je pouvais, j'ai trouvé que l'exception se produit dans w.déclaration(hqlAst) dans QueryTranslatorImpl:
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;
}
Est-il quelque chose de mal avec ma requête ou des annotations?
Vous devez vous connecter pour publier un commentaire.
NamedQuery doit être écrit JPQL, mais la requête semble mélanger les deux noms de la persistance des attributs et des noms de colonnes de base de données. Les noms de colonnes de base de données ne peut pas être utilisé en JPQL.
Dans ce cas, au lieu de
next_fire_time
nom de la persistance de l'attributepochTime
doit être utilisé. Aussitrigger_name
ressemble plus à un nom de la colonne de base de données que le nom de la persistance de l'attribut, mais il ne semble pas être mappé dans votre catégorie actuelle à tous. Après il est mappé, la requête est la suivante:Si la requête SQL est préférée, @NamedNativeQuery devrait être utilisé à la place.
Comme une note de côté, JPA 2.0 spécification n'est pas encourager le changement de clé primaire:
En général, les entités ne sont pas au courant de l'évolution fait via des requêtes JPQL. Que devient particulièrement intéressant lorsque vous essayez d'actualiser entité qui n'existe plus (à cause de la clé primaire a été changé).
De plus de nommage est un peu déroutant:
que le nom de l'entité.
cas lettre est plutôt rare de style.
le tableau et le nom de la classe ne correspond pas trop bien.