Creo que lo que está pasando con este código:
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
es esto:
en la línea 1:se crea un plan de consulta basado en algunos valores esperados para sus parámetros nombrados.
en la línea 4:la consulta se ejecuta con value1 y value2, pero esos valores no son "buenos valores" para el plan de consulta que se elaboró en la línea 1 y, por lo tanto, la base de datos está ejecutando un plan muy inapropiado para los valores reales y toma mucho tiempo.
¿Por qué?
Mirando el código fuente de HibernateSessionImpl.createSQLQuery(...)
Encontré esta línea de código:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
que llama a getQueryPlanCache()
con algún parámetroMetaData. Supongo que estos metadatos no son suficientemente buenos .