我正在试验JPA中的连接表继承(带有JPA 2.1的EclipseLink 2.6.0)。
如果我在根实体Vehicle
上执行以下JPQL语句,
List<Vehicle> vehicleList = entityManager.createQuery("SELECT v FROM Vehicle v", Vehicle.class).getResultList();
EclipseLink提供程序生成以下SQL语句。
SELECT DISTINCT vehicle_type FROM vehicle
SELECT t0.vehicle_id, t0.vehicle_type, t0.manufacturer, t1.vehicle_id, t1.no_of_passengers, t1.saddle_height FROM vehicle t0, BIKE t1 WHERE ((t1.vehicle_id = t0.vehicle_id) AND (t0.vehicle_type = ?))
bind => [Bike]
SELECT t0.vehicle_id, t0.vehicle_type, t0.manufacturer, t1.vehicle_id, t1.no_of_doors, t1.no_of_passengers FROM vehicle t0, CAR t1 WHERE ((t1.vehicle_id = t0.vehicle_id) AND (t0.vehicle_type = ?))
bind => [Car]
SELECT t0.vehicle_id, t0.vehicle_type, t0.manufacturer, t1.vehicle_id, t1.load_capacity, t1.no_of_containers FROM vehicle t0, TRUCK t1 WHERE ((t1.vehicle_id = t0.vehicle_id) AND (t0.vehicle_type = ?))
bind => [Truck]
如果将ORDER BY
子句添加到给定的JPQL语句中,如下所示,
List<Vehicle> vehicleList = entityManager.createQuery("SELECT v FROM Vehicle v ORDER BY v.vehicleId DESC", Vehicle.class).getResultList();
但是,EclipseLink提供程序会生成以下带有外连接的单个SQL语句。
SELECT t0.vehicle_id,
t0.vehicle_type,
t0.manufacturer,
t1.vehicle_id,
t1.load_capacity,
t1.no_of_containers,
t2.vehicle_id,
t2.no_of_passengers,
t2.saddle_height,
t3.vehicle_id,
t3.no_of_doors,
t3.no_of_passengers
FROM vehicle t0
LEFT OUTER JOIN truck t1
ON ( t1.vehicle_id = t0.vehicle_id )
LEFT OUTER JOIN bike t2
ON ( t2.vehicle_id = t0.vehicle_id )
LEFT OUTER JOIN car t3
ON ( t3.vehicle_id = t0.vehicle_id )
ORDER BY t0.vehicle_id DESC
JPA Wiki Book中提到了这一点。
最差的执行查询将是根或分支的查询 类。避免查询和与根和分支的关系 课程将有助于减轻这种负担。 如果你必须查询 根或分支类JPA提供程序使用两种方法, 一个是外部连接所有子类表,第二个是 首先查询根表,然后只查询所需的子类 直接表。第一种方法的优点是只需要 一个查询,第二个具有避免外连接的优点 通常在数据库中表现不佳。
当特定JPA提供程序确定应用哪个方法来生成/生成SQL语句时,查询根实体时 - 为什么此特定情况下的ORDER BY
子句有所不同?
我还没有尝试过其他JPA提供商。
我假设实体类是不相关的,但是如果你需要这些例子中使用的类的继承层次结构,请告诉我。