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

ntityManager API 提供了创建 Query 实例以执行原生 SQL 语句的createNativeQuery方法。

  实体User:

  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. }  


测试

  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.         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用JPA进行原生SQL查询时,可以借助Spring Data JPA的`@Query`注解和`nativeQuery=true`属性来实现。`@Query`注解是用来声明查询语句的,而`nativeQuery=true`则表示使用原生SQL查询。具体步骤如下: 1. 在Repository接口中定义一个方法,并使用`@Query`注解来声明原生SQL查询语句。例如:`@Query(value = "SELECT * FROM table_name WHERE condition", nativeQuery = true)` 2. 在方法中使用JPA的命名参数或占位符来传递参数。例如:`@Query(value = "SELECT * FROM table_name WHERE column_name = :param", nativeQuery = true)` 3. 如果需要返回实体对象,可以在Repository接口中定义一个与查询结果对应的构造函数,并在查询语句中使用`NEW`关键字来创建实体对象。例如:`@Query(value = "SELECT NEW com.example.EntityName(column1, column2) FROM table_name WHERE condition", nativeQuery = true)` 4. 调用Repository接口中定义的方法来执行原生SQL查询并获取结果。 需要注意的是,使用原生SQL查询可能会降低代码的可移植性,并且需要仔细处理SQL注入等安全问题。因此,在使用原生SQL查询时,建议谨慎使用,并遵循安全编码规范。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring boot jpa原生sql报Cannot resolve table错误解决方法](https://download.csdn.net/download/weixin_38622149/12744996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JPA用法与原声SQL](https://blog.csdn.net/qq_40206199/article/details/84860945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值