在Spring Data JPA(+ Hibernate)应用程序中考虑以下类:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "person")
public class Person { }
@Entity
@Table(name = "customer")
public class Customer extends Person { }
@Entity
@Table(name = "employee")
public class Employee extends Person { }
@Entity
@Table(name = "manager")
public class Manager extends Employee { }
public interface IPersonRepository extends JpaRepository<Person, Long> { }
public interface ICustomerRepository extends JpaRepository<Customer, Long> { }
public interface IEmployeeRepository extends JpaRepository<Employee, Long> { }
我最常见的用例涉及调用以下方法(从继承JpaRepository
):
IPersonRepository.findAll();
每当调用此方法时,Hibernate都会发出以下SQL查询:
select
person0_.id as id1_3_,
person0_.version as version2_3_,
person0_.first_name as first3_3_,
person0_.last_name as last4_3_,
person0_1_.customer_code as customer1_0_,
person0_2_.employee_code as employee1_1_,
person0_2_.manager_id as manager3_1_,
case
when person0_3_.id is not null then 3
when person0_1_.id is not null then 1
when person0_2_.id is not null then 2
when person0_.id is not null then 0
end as clazz_
from
person person0_
left outer join
customer person0_1_
on person0_.id=person0_1_.id
left outer join
employee person0_2_
on person0_.id=person0_2_.id
left outer join
manager person0_3_
on person0_.id=person0_3_.id;
每当执行此查询时,我只对Person
类中的公共字段感兴趣,因此我发现左外部联接无用。
问题在于,在我们的实际应用程序中,每个子表中都有8个子类,例如Employee
和和Customer
以及数百万条记录,这导致父表上的查询运行非常慢。
在这种情况下,是否有办法避免跨表的外部联接?请注意,我已尝试使用该 DiscriminatorColumn
方法,并且在这种情况下(使用Hibernate时)仍会执行连接。我还尝试了 Polymorphism
在所有可能的组合中对实体类进行特定于Hibernate的注释,并且仍然执行外部联接。
Spring Data JPA version: 1.2.0
Hibernate version: 4.2.1
经过数天的尝试解决此问题,我得出以下结论:
我想我将不得不等待JPA规范更改或满足我当前需求的JPA实现可用。
问题内容: 我已经这样写了HQL查询: Hibernate生成这样的sql查询: 但是当我写这样的东西: 它生成SQL: 因此,当我结合使用这种方法时,我会收到Oracle错误: 那么有没有办法对Hibernate说我只想接收一种类型的查询(旧样式或新样式)? 更新: 结合我的意思是这样的HQL查询: 因此,在这里我指定 Alarm 应该通过LEFT JOIN 与 User 连接,而不是指定如何将
问题内容: 我不了解左外部联接,右外部联接的概念,或者根本不理解为什么我们需要使用联接!我正在努力解决的问题以及正在处理的表格在这里:链接 问题3(b) 在SQL中构造命令以解决以下查询,解释了为什么必须使用(外部)联接方法。[5分]“找到每名工作人员及其his属(如果有)的姓名” 问题3(c)- 使用(i)join方法和(ii)子查询方法在SQL中构造命令以解决以下查询。[10分]“查找在计算机
问题内容: 我想确认SQL查询 完全等同于FROM子句中的其他排列,例如 或者 只要橙子和奇异果之间的显式LEFT JOIN保持不变即可。根据我在各种文档中所阅读的内容,返回的集合应该完全相同。 我真的只关心查询的结果,而不关心它在实际数据库中的性能。(我使用的是PostgreSQL 8.3,而AFAIK不支持有关连接顺序的优化程序提示,它将尝试自动创建最佳查询计划)。 问题答案: 它是相同的,但
问题内容: 我试图在一个列上内部联接两个表。从数据库方面来看,没有映射,因为这是我不想讨论的。 我想使用INNER JOIN执行HQL查询并检索ROLE对象/结果。 到目前为止,这是我的总部 session.createQuery(“ ROLE作为角色,INNER JOIN INVOLVEMENT作为参与角色,id。X =参与.roleid WHERE参与.id = X”)。list(); 我看到
我对JPA中的继承是新手。我不知道如何查询这样的内容: 让我们假设一个联接继承映射,其中a是一个具有'id'和'name'的实体。还有从A继承的实体A1和A2。A1提供字段'int1',A2提供字段'int2'
问题内容: 我需要执行此查询:: 我在python中有这些类: 我如何从下面到达上面? 问题答案: 假设并且来自,并且您定义了一个关系,就应该这样做: