在JPA中查询实体继承中的根实体

时间:2015-05-22 10:35:56

标签: jpa inheritance eclipselink jpa-2.1

我正在试验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提供商。

我假设实体类是不相关的,但是如果你需要这些例子中使用的类的继承层次结构,请告诉我。

0 个答案:

没有答案