Вы не можете. Он называется «неявный полиморфизм», и это довольно приятная (хотя и нежелательная в вашем случае :-)) функция, предоставляемая Hibernate. Когда вы запрашиваете список базовых объектов, фактические возвращаемые экземпляры имеют фактические конкретные реализации. Следовательно, левое соединение необходимо для Hibernate, чтобы выяснить, является ли конкретная сущность FormBase или Form.
Обновление (слишком большой, чтобы поместиться в комментарии):
Общая проблема здесь заключается в том, что если вы обманули Hibernate, чтобы загружать только базовую сущность, вы можете получить несовместимое состояние сеанса. Учтите следующее:
Form
(который сохраняется в таблицах form_base
и form
) был каким-то образом загружен как FormBase
.
- Вы удалили его.
- Во время сброса Hibernate (который думает, что мы имеем дело с
FormBase
и, следовательно, блаженно не подозревает, что задействованы 2 таблицы), выдает оператор DELETE FROM form
, который выдает исключение при нарушении FK.
Неявный полиморфизм существует, чтобы предотвратить это - Form
- это всегда a Form
, а не FormBase
. Конечно, вы можете использовать отображение «таблица на иерархию», где все находится в одной таблице и, следовательно, не требуется никаких объединений, но вы в конечном итоге получите (потенциально) множество столбцов NULL и - ergo - неспособность указать not-null на детские свойства.
Все это говорит о том, что, если это REALLY огромная проблема для вас (чего обычно не должно быть - предположительно, это индексированное соединение), вы можете попробовать использовать собственный запрос, чтобы просто вернуть FormBase
экземпляров.