我正在使用Hibernate的JPA實現,並且由於爲獲取的每個實體發出了多個SQL查詢,因此性能很差。如果我使用加入的JPA查詢,它只會生成一個SQL查詢,但不會查找行將爲空的關係。JPA/Hibernate空值優化查詢優化
例如,考慮這個簡單的模式。一個人住在一個地址,並受僱於一家公司。地址和僱主都是可選的,因此可以爲空。
@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;
我看到的問題是,在多個SQL查詢結果人單JPA查詢在數據庫上。例如,下面的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查詢與一羣聯接。問題是,如果地址或僱主爲空,則加入的查詢將無法找到它。
所以我離開時要麼使用慢速連接查詢,要麼快速連接的查詢不檢索行將爲空關係。我必須在這裏錯過一些東西。當然有一種快速和完整的查詢方法。
LEFT JOIN並獲得成功,謝謝。 – 2009-01-03 06:50:47