Base abstract class: class Vehicle { Long Id; String Color; } class Car extends Vehicle { EngineType Engine; } class Bicycle extends Vehicle { BicycleType BicycleType; } 1. Single Table Все объекты базового класса: HQL: from Vehicle SQL: select * from VEHICLE Все объекты Car: HQL: from Car SQL: select ID, COLOR, ENGINE from VEHICLE where VEHICLE_TYPE='CAR' 2. Table per class Все объекты базового класса: HQL: from Vehicle SQL: select v.VEHICLE_ID, v.COLOR, c.ENGINE_TYPE, b.BICYCLE_TYPE (case when c.VEHICLE_ID IS NOT NULL THEN 'CAR' when b.VEHICLE_ID IS NOT NULL THEN 'BICYCLE') VEHICLE_TYPE from VEHICLE v left outer join CAR c on (v.VEHICLE_ID = c.VEHICLE_ID) left outer join BICYCLE b on (v.VEHICLE_ID = b.VEHICLE_ID) Все объекты Car: HQL: from Car SQL: select v.VEHICLE_ID, v.COLOR, c.ENGINE_TYPE from VEHICLE v inner join CAR c on (v.VEHICLE_ID = c.VEHICLE_ID) 3. Table per concrete class Все объекты базового класса: HQL: from Vehicle SQL: select CAR_ID VEHICLE_ID, COLOR, ENGINE_TYPE, NULL BICYCLE_TYPE, 'CAR' VEHICLE_TYPE from CAR union all select BICYCLE_ID VEHICLE_ID, COLOR, NULL ENGINE_TYPE, BICYCLE_TYPE, 'BICYCLE' VEHICLE_TYPE from BICYCLE Все объекты Car: HQL: from Car SQL: select * from CAR