jdbc vs jpa执行

问题描述:

如何在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?

在此先感谢!

你应该创建为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