Eu acho que o que está acontecendo com este código:
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
é isto:
na linha 1 :um plano de consulta é criado com base em alguns valores esperados para seus parâmetros nomeados.
na linha 4 :a consulta é executada com valor1 e valor2, mas esses valores não são "bons valores" para o plano de consulta que foi elaborado na linha 1 e assim, o banco de dados está executando um plano muito inadequado para os valores reais e demora muito tempo.
Por quê?
Observando o código-fonte de
HibernateSessionImpl.createSQLQuery(...)
Encontrei esta linha de código:SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
que está chamando
getQueryPlanCache()
com algum parâmetroMetaData. Presumo que esses metadados não sejam bons o suficiente .