Если вы знаете, что идентификаторы существуют, вы можете использовать load (..) для создания прокси без фактического обращения к БД:
Возвращает постоянный экземпляр данного класса сущностей с заданным идентификатором, получая указанный режим блокировки, предполагая, что экземпляр существует.
List<Song> list = new ArrayList<>(ids.size());
for (Integer id : ids)
list.add(session.load(Song.class, id, LockOptions.NONE));
Как только вы получите доступ к неидентификатору доступа, Hibernate проверит кеши и откат к БД, если необходимо, используя пакетную выборку, если настроено.
Если идентификатор не существует, исключение ObjectNotFoundException произойдет после загрузки объекта. Это может быть где-то в вашем коде, где вы не ожидаете исключения - в конце вы используете простой метод доступа. Поэтому будьте на 100% уверены, что идентификатор существует, или, по крайней мере, форсируйте исключение ObjectNotFoundException раньше, чем вы ожидаете, например, сразу после заполнения списка.