JPA的查询语言—使用原生SQL

时间:2022-09-22 09:42:46
ntityManager API 提供了创建 Query 实例以执行原生 SQL 语句的createNativeQuery方法。

  实体User:

[java] view plain copy
  1. package com.cndatacom.jpa.entity;   
  2.     
  3. import javax.persistence.Column;   
  4. import javax.persistence.Entity;   
  5. import javax.persistence.GeneratedValue;   
  6. import javax.persistence.Id;   
  7. import javax.persistence.Table;   
  8.     
  9. @Entity  
  10. @Table(name="t_user")   
  11. public class User {   
  12.         
  13.     /**  
  14.      * 主键  
  15.      */  
  16.     @Id  
  17.     @GeneratedValue  
  18.     private Long id;   
  19.         
  20.     /**  
  21.      * 名字  
  22.      */  
  23.     @Column(name="name",length=50)   
  24.     private String name;   
  25.         
  26.     /**  
  27.      * 密码  
  28.      */  
  29.     @Column(name="password",length=20)   
  30.     private String password;   
  31.         
  32.     /**  
  33.      * 邮箱  
  34.      */  
  35.     @Column(name="email",length=50)   
  36.     private String email;   
  37.         
  38.     /**  
  39.      * 年龄  
  40.      */  
  41.     @Column(name="age",length=3)   
  42.     private int age;   
  43.         
  44.     public User() {   
  45.             
  46.     }   
  47.         
  48.     //以下省略getter/setter方法   
  49.     //......   
  50.     
  51.     
  52.             
  53. }  


测试

[java] view plain copy
  1. package com.cndatacom.jpa.test;   
  2.     
  3. import java.util.List;   
  4.     
  5. import javax.persistence.EntityManager;   
  6. import javax.persistence.EntityManagerFactory;   
  7. import javax.persistence.Persistence;   
  8. import javax.persistence.Query;   
  9.     
  10. import org.junit.After;   
  11. import org.junit.Before;   
  12. import org.junit.Test;   
  13.     
  14. import com.cndatacom.jpa.entity.User;   
  15.     
  16.     
  17. /**  
  18.  * 测试JPA原生SQL查询  
  19.  * @author Luxh  
  20.  */  
  21. public class TestNativeQuery {   
  22. EntityManagerFactory emf = null;   
  23.         
  24.     @Before  
  25.     public void before() {   
  26.         //根据在persistence.xml中配置的persistence-unit name 创建EntityManagerFactory   
  27.         emf = Persistence.createEntityManagerFactory("myJPA");   
  28.     }   
  29.         
  30.     @After  
  31.     public void after() {   
  32.         //关闭EntityManagerFactory   
  33.         if(null != emf) {   
  34.             emf.close();   
  35.         }   
  36.     }   
  37.         
  38.             
  39.     /**  
  40.      * 查询的结果是对象数组的集合  
  41.      */  
  42.     @Test  
  43.     public void testNativeQuery1() {   
  44.         EntityManager em = emf.createEntityManager();   
  45.         //定义SQL   
  46.         String sql = "SELECT * FROM t_user";   
  47.         //创建原生SQL查询QUERY实例   
  48.         <span style="color:#ff0000;">Query query =  em.createNativeQuery(sql);</span>   
  49.         //执行查询,返回的是对象数组(Object[])列表,   
  50.         //每一个对象数组存的是相应的实体属性   
  51.         List objecArraytList = query.getResultList();   
  52.         for(int i=0;i<objecArraytList.size();i++) {   
  53.             Object[] obj = (Object[]) objecArraytList.get(i);   
  54.            //使用obj[0],obj[1],obj[2]...取出属性             
  55.         }   
  56.         em.close();   
  57.     }   
  58.         
  59.         
  60.     /**  
  61.      * 查询的结果是实体的集合  
  62.      */  
  63.     @Test  
  64.     public void testNativeQuery2() {   
  65.         EntityManager em = emf.createEntityManager();   
  66.         //定义SQL   
  67.         String sql = "SELECT * FROM t_user";   
  68.         //创建原生SQL查询QUERY实例,指定了返回的实体类型   
  69.        <span style="color:#ff0000;"> Query query =  em.createNativeQuery(sql,User.class);   
  70. </span>        //执行查询,返回的是实体列表,   
  71.         List<User> userList = query.getResultList();   
  72.             
  73.         em.close();   
  74.     }   
  75.         
  76.         
  77.     /**  
  78.      * 查询单个属性  
  79.      * 返回的是这个属性值的集合  
  80.      */  
  81.     @Test  
  82.     public void testNativeQuery3() {   
  83.         EntityManager em = emf.createEntityManager();   
  84.         //定义SQL   
  85.         String sql = "SELECT t.name FROM t_user t";   
  86.         //创建原生SQL查询QUERY实例   
  87.     <span style="color:#ff0000;">    Query query =  em.createNativeQuery(sql);</span>   
  88.         //执行查询,返回的是String类型的集合,因为name这个属性是String类型   
  89.         List<String>  resultList = query.getResultList();   
  90.         em.close();   
  91.     }   
  92.         
  93.         
  94.     /**    
  95.        * 查询多个属性  
  96.        * 返回的是这些属性值的数组的集合  
  97.        */     
  98.     @Test     
  99.     public void testNativeQuery4() {       
  100.         EntityManager em = emf.createEntityManager();      
  101.         //定义SQL            
  102.         String sql = "SELECT t.name,t.age,t.email FROM t_user t";          
  103.         //创建原生SQL查询QUERY实例         
  104.     <span style="color:#ff0000;">    Query query =  em.createNativeQuery(sql); </span>         
  105.         //执行查询,返回的是查询属性值数组的集合          
  106.         List objecArraytList = query.getResultList();   
  107.         for(int i=0;i<objecArraytList.size();i++) {         
  108.             Object[] obj = (Object[]) objecArraytList.get(i);   
  109.              //使用obj[0],obj[1],obj[2]取出属性   
  110.         }          
  111.         em.close();    
  112.             
  113.     }   
  114.