Je pense que ce qui se passe avec ce code :
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
est-ce :
à la ligne 1 :un plan de requête est créé en fonction de certaines valeurs attendues pour vos paramètres nommés.
à la ligne 4 :la requête est exécutée avec valeur1 et valeur2, mais ces valeurs ne sont pas de "bonnes valeurs" pour le plan de requête qui a été élaboré à la ligne 1 et donc, la base de données exécute un plan très inapproprié pour les valeurs réelles et il faut beaucoup de temps.
Pourquoi ?
En regardant le code source de HibernateSessionImpl.createSQLQuery(...)
J'ai trouvé cette ligne de code :
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
qui appelle getQueryPlanCache()
avec quelques paramètresMetaData. Je suppose que ces métadonnées ne sont pas assez bonnes .