2009-11-14 38 views
1

我是新來的EJB,並試圖讓我的頭將SQL概念翻譯成EJB實體bean。將外部連接SQL查詢翻譯成EJB實體bean

假設我有兩個表:PEOPLE(id,name),CONTACT(pid,phone_number)。如果我想所有的人的名單,他們是否擁有手機#秒,在我的EJB會話bean我只需發出通過JDBC SQL查詢,如:

SELECT PEOPLE.name, CONTACT.phone_number 
FROM PEOPLE 
LEFT JOIN CONTACT ON PEOPLE.id = CONTACT.pid 

而不是使用SQL/JDBC的,我現在想要使用EJB實體bean。所以我爲我的表創建相應的EJB3實體bean類。

所以我現在都可以訪問兩個實體類從我的會話bean,我不再希望直接從我的會話bean訪問我的數據庫表通過SQL/JDBC。我只想使用我的實體bean和JPA的功能。什麼是正確的EJB設計,以便在我的會話bean中獲得與我的SQL查詢相同的結果?

我不清楚如何使用EJB實體bean類來產生與我的SQL外部連接查詢相同的結果。幫幫我。

回答

2

首先,創建兩個JPA實體,這樣的事情對People

@Entity 
@Table(name="PEOPLE") 
public class People { 

    @Id @Column 
    private Long id; 

    @Column 
    private String name; 

    @OneToOne 
    @JoinColumn(name="pid") 
    private Contact contact; 

    // getters and setters 
} 

而對於Contact

@Entity 
@Table(name="CONTACT") 
public class Contact { 

    @Id @Column 
    private Long pid; 

    @Column 
    private String phoneNumber; 

    // getters and setters 
} 

然後,產生外使用JOIN查詢JPQL:

SELECT p FROM People p LEFT JOIN p.contact c 
+0

謝謝。作爲後續行動,這可能嗎? SELECT p.name,c.phoneNumber FROM People p LEFT JOIN p.contact c 如果是這樣,產生的對象類型是什麼?我正在尋找如何做到這一點的樣本,但如果你有鏈接,將不勝感激。謝謝。 – Sajee 2009-11-14 19:33:30

+0

您必須創建一個自定義對象來保存該查詢的結果,並像修改查詢那樣'SELECT NEW my.package.MyHolder(p.name,C.phoneNumber)FROM ...'。有關更詳細的示例,請參閱http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html。 – 2009-11-14 20:06:40

+0

假設聯繫人表使用列名稱Id而不是Pid。人體定義如何變化?這裏不會有衝突:@JoinColumn(name =「id」)?現在id被使用兩次。什麼是解決方法? – Sajee 2009-11-15 19:23:32