我正在使用 Hibernate 的 JPA 实现,并且看到性能很差,因为为每个获取的实体发出了多个 SQL 查询。如果我使用连接的 JPA 查询,它只会生成一个 SQL 查询,但找不到行将为空关系。
例如,考虑这个简单的模式。一个人住在一个地址并受雇于一家公司。地址和雇主都是可选的,因此可以为空。
@Entity
public class Person {
public name;
@ManyToOne
@Column(nullable=true)
public Address address
@ManyToOne
@Column(nullable=true)
public Company employer
}
@Entity
public class Address {
address attributes ...
}
@Entity
public class Company {
company attributes ...
}
上面没有显示的是每个 JPA 实体都有某种 ID(键):
@Id
public Integer id;
我看到的问题是对 Person 的单个 JPA 查询会导致对数据库的多个 SQL 查询。例如,以下 JPA 查询:
select p from Person p where ...
导致 SQL 查询:
select ... from Person where ...
以及每个检索到的人的以下一对 SQL 查询:
select ... from Address a where a.id=xxx
select ... from Company c where c.id=yyy
这对性能有很大的影响。如果查询结果集为 1000 人,则生成 1+1000+1000=2001 条 SQL 查询。
所以我尝试通过强制加入来优化 JPA 查询:
select p from Person p join p.address a join p.employer e where ...
或者:
select p, a, e from Person p join p.address a join p.employer e where ...
这会导致一个带有一堆连接的 SQL 查询。问题是如果地址或雇主为空,则连接查询将找不到它。
所以我要么使用慢的无连接查询,要么使用不检索行的快速连接查询将使关系为空。我一定在这里遗漏了一些东西。肯定有一种快速和完整查询的方法。