2013-04-24 38 views
1

如何在JPA中執行此操作?jdbc vs jpa執行

數據庫:

School 
------ 
id int PK 
name varchar 
state int FK (State(id)) 

State 
----- 
id int PK 
desc varchar 

的Java:

SchoolShow 
---------- 
int id; 
String name; 
int iState; 
String sState; 

代碼:

select sc.name, st.desc from school sc, state st where st.id=sc.state and sc.id=? 

while(rs.hasNext()){ 
    SchoolShow ss=new SchoolShow(); 
    ss.setName(rs.getString("name")); 
    ss.setSState(rs.getString("desc")); 
} 

¿我可以有不同表性的@Entity?

在此先感謝!

回答

1

你應該創建爲SchoolState表實體和使用@ManyToOne關係上School實體的state屬性來引用的狀態。

然後你就可以查詢這個樣子,在導航從學校到國家的關係:

List result = em.createQuery("SELECT sc.name, sc.state.desc FROM School sc").getResultList(); 

注意,列表中的每個元素是Object[]。您需要遍歷它們並將值分配給DTO。

您還可以使用JPA構造函數表達式安全性,並減少混亂:

List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO(sc.name, sc.state.desc) FROM School sc").getResultList(); 

的DTO類型必須與所有相關屬性的構造函數。

+0

謝謝kostja!這是我在想什麼,但我想確保在學校需要一個對象屬性 - >狀態,而不是原始狀態。所以JPA將比JDBC慢得多......爲什麼人們使用它? – leccionesonline 2013-04-24 12:11:36

+0

@leccionesonline - 不客氣:) JPA作爲一個JDBC抽象,在大多數情況下確實比JDBC慢,但並非全部 - JPA提供適當的緩存,而JDBC不提供適當的緩存。雖然我還沒有看到真正的JPA-JDBC基準,所以我不能說慢了多少。我使用JPA的原因是JDBC需要更多的樣板代碼,這在編寫和閱讀時都會耗費開發時間。 – kostja 2013-04-24 12:21:55

+0

我轉移到JPA的原因是我聽說Spring不再支持JDBC,JPA已經成爲參考實現 – leccionesonline 2013-04-24 14:39:03