D'après la description de votre problème, il semble que vous renifliez des paramètres. Essentiellement, SQL Server crée un plan de requête basé sur un ancien ensemble de valeurs de paramètres qui ont été transmises et qui ne créent pas un plan d'exécution efficace pour la requête en cours d'exécution.
En règle générale, je résous ce problème en transmettant les valeurs de paramètre dans des variables locales et en utilisant celles de ma requête ou en utilisant OPTION (RECOMPILE). Cependant, puisque vous utilisez Hibernate, ma solution habituelle n'est pas une option pour vous. Si je comprends bien, la meilleure option sera d'utiliser Hibernate pour exécuter une requête SQL native en utilisant prepareStatement() ou createSQLQuery() qui, malheureusement, supprime certains des avantages de l'utilisation d'Hibernate.