EDIT(完全重新途徑):JPA + Hibernate的 - 內父母和子女表之間加入
我試圖推動新的項目使用JPA的,但我有一個所謂平凡的奮鬥問題:兩個表(父和子)之間的INNER JOIN。
我將只提供必要的信息,並將所有其他信息留下。請隨時詢問更多信息是否需要。有兩個表LANGUAGE和MESSAGE_RESOURCE,其中父表是LANGUAGE(主鍵ID_LANGUAGE),而子表具有也稱爲ID_LANGUAGE的父表的外鍵。
語言(父)類:
@Entity
@Table(name = "PF_LANGUAGE")
public class Language {
@Id
@Column(name = "ID_LANGUAGE", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int idLanguage;
@OneToMany(mappedBy="language",targetEntity=MessageResource.class, fetch=FetchType.EAGER)
private Collection<MessageResource> messageResources;
}
的子類:
@Entity
@Table(name = "PF_MESSAGE_RESOURCE")
public class MessageResource {
@Id
@Column(name = "ID_MESSAGE_RESOURCE", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int idMessageResource;
@ManyToOne(optional=false)
@JoinColumn(name="ID_LANGUAGE")
private Language language;
}
我取帶有命名查詢結果:
entityManager.createNamedQuery("select l, r from Language l join l.messageResources r");
這導致結果Object數組,其中每個條目包含一個語言MessageResource對。問題是,這是在單獨的查詢中完成的。
我可以在調試輸出中看到第一個查詢是兩個表之間的INNER JOIN,包含輸出中兩個表的列,所以這應該足夠了。 但是,JPA正在執行2次額外的查詢(LANGUAGE記錄的數量),以再次獲取每個父表的子表值,這不應該是必需的。
首先查詢這是足以讓所有的數據:
select
language0_.ID_LANGUAGE as ID1_5_0_,
messageres1_.ID_MESSAGE_RESOURCE as ID1_4_1_,
language0_.CODE as CODE5_0_,
language0_.DATE_INS as DATE3_5_0_,
language0_.DESCRIPTION as DESCRIPT4_5_0_,
messageres1_.DATE_INS as DATE2_4_1_,
messageres1_.KEY as KEY4_1_,
messageres1_.ID_LANGUAGE as ID5_4_1_,
messageres1_.VALUE as VALUE4_1_
from
PF_LANGUAGE language0_
inner join
PF_MESSAGE_RESOURCE messageres1_
on language0_.ID_LANGUAGE=messageres1_.ID_LANGUAGE
兩個冗餘查詢,如下面也對之後的第一個內連接(他們是爲每種語言表中的記錄運行一次)數據庫運行:
select
messageres0_.ID_LANGUAGE as ID5_5_1_,
messageres0_.ID_MESSAGE_RESOURCE as ID1_1_,
messageres0_.ID_MESSAGE_RESOURCE as ID1_4_0_,
messageres0_.DATE_INS as DATE2_4_0_,
messageres0_.KEY as KEY4_0_,
messageres0_.ID_LANGUAGE as ID5_4_0_,
messageres0_.VALUE as VALUE4_0_
from
PF_MESSAGE_RESOURCE messageres0_
where
messageres0_.ID_LANGUAGE=?
我需要消除由JPA生成的兩個冗餘附加查詢。第一個內部連接足以獲取所有數據。
需要此幫助。任何線索?
什麼問題?你想要什麼樣的行爲? – axtavt
我更新了問題信息,期望的行爲是INNER JOIN,但我雖然隱含了問題標題和文本流程 – JavaJuggler
您是否嘗試更改fetch = FetchType.EAGER以使messageResources獲取= FetchType.LAZY?由於您明確加入,因此更改FetchType可能會有所幫助。 – arasul