EntityManager API 提供了創建 Query 實例以執行原生 SQL 語句的createNativeQuery方法。
實體User:
package com.cndatacom.jpa.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
/**
* 主鍵
*/
@Id
@GeneratedValue
private Long id;
/**
* 名字
*/
@Column(name="name",length=50)
private String name;
/**
* 密碼
*/
@Column(name="password",length=20)
private String password;
/**
* 郵箱
*/
@Column(name="email",length=50)
private String email;
/**
* 年齡
*/
@Column(name="age",length=3)
private int age;
public User() {
}
//以下省略getter/setter方法
//......
}
測試:
package com.cndatacom.jpa.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.cndatacom.jpa.entity.User;
/**
* 測試JPA原生SQL查詢
* @author Luxh
*/
public class TestNativeQuery {
EntityManagerFactory emf = null;
@Before
public void before() {
//根據在persistence.xml中配置的persistence-unit name 創建EntityManagerFactory
emf = Persistence.createEntityManagerFactory("myJPA");
}
@After
public void after() {
//關閉EntityManagerFactory
if(null != emf) {
emf.close();
}
}
/**
* 查詢的結果是對象數組的集合
*/
@Test
public void testNativeQuery1() {
EntityManager em = emf.createEntityManager();
//定義SQL
String sql = "SELECT * FROM t_user";
//創建原生SQL查詢QUERY實例
Query query = em.createNativeQuery(sql);
//執行查詢,返回的是對象數組(Object[])列表,
//每一個對象數組存的是相應的實體屬性
List objecArraytList = query.getResultList();
for(int i=0;i<objecArraytList.size();i++) {
Object[] obj = (Object[]) objecArraytList.get(i);
//使用obj[0],obj[1],obj[2]...取出屬性
}
em.close();
}
/**
* 查詢的結果是實體的集合
*/
@Test
public void testNativeQuery2() {
EntityManager em = emf.createEntityManager();
//定義SQL
String sql = "SELECT * FROM t_user";
//創建原生SQL查詢QUERY實例,指定了返回的實體類型
Query query = em.createNativeQuery(sql,User.class);
//執行查詢,返回的是實體列表,
List<User> userList = query.getResultList();
em.close();
}
/**
* 查詢單個屬性
* 返回的是這個屬性值的集合
*/
@Test
public void testNativeQuery3() {
EntityManager em = emf.createEntityManager();
//定義SQL
String sql = "SELECT t.name FROM t_user t";
//創建原生SQL查詢QUERY實例
Query query = em.createNativeQuery(sql);
//執行查詢,返回的是String類型的集合,因為name這個屬性是String類型
List<String> resultList = query.getResultList();
em.close();
}
/**
* 查詢多個屬性
* 返回的是這些屬性值的數組的集合
*/
@Test
public void testNativeQuery4() {
EntityManager em = emf.createEntityManager();
//定義SQL
String sql = "SELECT t.name,t.age,t.email FROM t_user t";
//創建原生SQL查詢QUERY實例
Query query = em.createNativeQuery(sql);
//執行查詢,返回的是查詢屬性值數組的集合
List objecArraytList = query.getResultList();
for(int i=0;i<objecArraytList.size();i++) {
Object[] obj = (Object[]) objecArraytList.get(i);
//使用obj[0],obj[1],obj[2]取出屬性
}
em.close();
}
}
