Мисля, че какво се случва с този код:
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
е това:
на ред 1:създава се план за заявка на базата на някои очаквани стойности за посочените от вас параметри.
на ред 4:заявката се изпълнява със стойност1 и стойност2, но тези стойности не са „добри стойности“ за плана на заявката, който беше разработен на ред 1 и така базата данни изпълнява много неподходящ план за действителните стойности и отнема много време.
Защо?
Разглеждане на изходния код на HibernateSessionImpl.createSQLQuery(...)
Намерих този ред код:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
който извиква getQueryPlanCache()
с някакъв параметърMetaData. Предполагам, че тези метаданни не са достатъчно добри .