Z opisu problemu wynika, że masz do czynienia z podsłuchiwaniem parametrów. Zasadniczo SQL Server tworzy plan zapytania na podstawie starszego zestawu wartości parametrów, które zostały przekazane i które nie tworzą efektywnego planu wykonania dla aktualnie uruchomionego zapytania.
Zazwyczaj rozwiązuję ten problem, przekazując wartości parametrów do zmiennych lokalnych i używając tych w moim zapytaniu lub używając OPCJI (RECOMPILE). Jednak ponieważ używasz Hibernate, moje zwykłe rozwiązanie nie jest dla ciebie opcją. Jak rozumiem, najlepszą opcją będzie użycie Hibernate do uruchomienia natywnego zapytania SQL przy użyciu metody PrepareStatement() lub createSQLQuery(), co niestety usuwa niektóre korzyści wynikające z używania Hibernate.