gpt4 book ai didi

performance - 具有空值的 JPA/Hibernate 查询优化

转载 作者:行者123 更新时间:2023-12-02 00:46:14 25 4
gpt4 key购买 nike

我正在使用 Hibernate 的 JPA 实现,并且发现性能很差,因为为每个获取的实体发出了多个 SQL 查询。如果我使用一个连接的 JPA 查询,它只生成一个 SQL 查询,但没有找到行将为 null 关系。

例如,考虑这个简单的模式。一个人住在一个​​地址并受雇于一家公司。地址和雇主都是可选的,因此可以为空。

@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 查询。问题是如果地址或雇主为空,则连接查询将找不到它。

所以我只能使用速度较慢的无连接查询,或者不检索行的快速连接查询将使关系为空。我一定是在这里遗漏了什么。肯定有一种快速完整查询的方法。

最佳答案

我猜你需要一个左连接,即

SELECT p FROM Person p LEFT JOIN p.address a LEFT JOIN p.employer e WHERE...

参见 this blog entry for an example

请注意,我实际上并没有用 JPA 尝试过这个,但它在 HQL 中运行良好,HQL 在很多方面都是 JPA 标准的基础。

它不能与普通连接一起使用的原因是默认是内部连接。

关于performance - 具有空值的 JPA/Hibernate 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/408456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com