Since your strategy is read-only, I'll assume that the data is immutable within the application? Some things to look for:
1.) even though you've enabled the query cache, each HQL query must set cachable = true:
Code:
Query query = session.createQuery("from CRONumberDetailsResult as phone_details where phone_details.slotId = :slotId");
query.setCachable(true);
If you don't set cachable = true, you'll always be hitting the database.
2.) There's a difference between query.list() & query.iterate(). Query.list() will get all of the elements in one pass and doen't hot the L2 cache. Query.iterate() will issue a query to load all of the PKs in the result set. As you iterate over the results, it will check the cache for an entry.
One last thing to check: how long does the plain JDBC query take to execute & return the same set of data?
Hope this helps.
Ryan-