Вам нужно будет включить кеширование запросов и этот конкретный запрос как кеширующий. Это доступно только в JPA 2.0 через подсказки.
query.setHint(“org.hibernate.cacheable”, true);
И включите кэш запросов, установив следующее свойство
hibernate.cache.use_query_cache true
Другим решением было бы использование getReference в цикле и включение пакетной загрузки. Если экземпляр существует в кеше, он будет возвращен из кеша - если нет, когда к первому прокси-объекту обращаются, он запускает один запрос для загрузки пакета из них. Вы можете скрыть это за функцией полезности.
public List<T> findMany(Class<T> entityClass,List<? extends Serializable> ids) {
List<T> result = new ArrayList<T>;
for(Serializable id:ids) {
result.add(entityManager.getRefrence(id));
}
for(T entity:result) {
// force initialization of proxies, if batch loading is enabled
// this shouldn't lead to one query per entity
Hibernate.initialize(entity);
}
return result;
}
Для этого может потребоваться несколько настроек - еще не проверял - особенно в части обобщения.