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(); } }