Не совсем понятно, что вы хотите сделать.
Прежде всего, поскольку Foo наследуется от Bar, поиск экземпляров Bar автоматически возвращает экземпляры Foo. Hibernate заботится о присоединении к таблицам самостоятельно.
Второе: ваш SQL-запрос действительно странный. Вы делаете левое соединение (что означает, что вы ищете бары, у которых может не быть связанного с foo), но у вас также есть где close на foo.bar_id, который не равен нулю. Фактически это является внутренним соединением и может быть переписано как
select b.* from bar b inner join foo f on f.bar_id = b.id
Если вы хотите искать только Foos и только Foos, тогда используйте Критерии с Foo в качестве корневого объекта:
getSession()
.createCriteria(Foo.class)
.list();
Вы получите экземпляры Foo, но, поскольку Foo расширяет Bar, эти экземпляры Foo также являются экземплярами Bar. Вот что такое наследство.
Теперь, если вы создаете свой экземпляр Criteria динамически и в какой-то момент понимаете, что поиск должен возвращать только экземпляры Foo, вы должны использовать свойство неявного класса:
Criteria c = getSession().createCriteria(Bar.class, "bar")
// ...
if (limitToFoos) {
c.add(Restrictions.eq("bar.class", Foo.class));
}