2012-04-16 25 views
0

早上好。我一直在試圖回答這個問題。打開JPA如何取回來自外鍵關係的結果

如果你有一個表有外鍵到另一個表,並且你想要兩個表的結果,使用基本的SQL你會對外鍵進行內部連接,你會得到你請求的所有結果信息。當您在外鍵上生成JPA實體時,您會在外鍵列上獲得@oneToone註釋,@oneToMany,@ManyToMany,@ManyToOne等。我有@oneToMany通過外鍵和對應的表列中的主鍵相應的@ManyToOne我也有一個@joinedON註釋在正確的列...我也有一個基本的命名查詢,將選擇從第一表。我需要做一個連接來從兩個表中獲取信息,就像我需要在基本的SQL中做的那樣?或者我有這些註釋的事實將這些記錄拉回給我?需要明確的是,如果我有這是關係到基於外鍵關係表B表A中,我想b根據外鍵或

Select * From A inner Join B on A.column2 = B.column1 

或者其他兩個表我會聯結表中的記錄一些這樣的無意義(請原諒我的SQL,如果它不完全正確,但你有想法)... 該查詢將選擇所有列A和B,其中這兩個選定的列... 這是我的命名查詢,我使用....

@NamedQuery(name="getQuickLaunch", query = "SELECT q FROM QuickLaunch q") 

這是我如何打電話,在我的無狀態會話bean ...

try 
    { 
     System.out.println("testing 1..2..3"); 
     listQL = emf.createNamedQuery("getQuickLaunch").getResultList(); 
     System.out.println("What is the size of this list: number "+listQL.size()); 
     qLaunchArr = listQL.toArray(new QuickLaunch[listQL.size()]);    

    } 

現在這個調用返回表A的所有列,但它缺少表B的列。我的第一本能是改變查詢來加入這兩個表......但那種讓我想想使用JPA有什麼意義,然後如果我只是寫一些相同的查詢,那我就會寫在不同的地方。另外,我不想忽略簡單的事情。那麼你說堆棧溢出愛好者呢?如何使用JPA取回所有連接查詢的數據?

回答

1

假設您有一個具有與聯繫人實體的OneToMany關聯的Person實體。

當你從EntityManager的一個人,要求其收集接觸的任何方法都會懶洋洋地加載該人的聯繫人列表:

person.getContacts().size(); 
// triggers a query select * from contact c where c.personId = ? 

如果你想使用一個單一的查詢加載人及其所有聯繫人,您在SQL查詢需要一個fetch

select p from Person p 
left join fetch p.contacts 
where ... 

您還可以標記該協會本身也渴望加載,使用@OneToMany(lazy = false),但隨後一個人每次被加載時(VIE em.find()或任何q uery),其聯繫人也將被加載。

+0

這是否會在指定的查詢中獲取? – SoftwareSavant 2012-04-16 14:30:09

+0

查詢是否被命名並不會改變任何內容。 JPQL是JPQL。如果您希望命名查詢執行提取,請將聯合提取添加到指定查詢中。 – 2012-04-16 14:40:47

+0

我是否需要在那裏?我需要指定所需的ID連接列嗎?到目前爲止,我所看到的所有例子都有點含糊 – SoftwareSavant 2012-04-16 15:14:45