【Query 接口下的常用API】

JPA 学习--Query接口下的 API 测试


【API 测试类:Test_QueryAPI.Java

[java] view plain copy
  1. package org.zgf.jpa.entity;  
  2.   
  3. import java.math.BigInteger;  
  4. import java.util.Calendar;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  8. import javax.persistence.Query;  
  9. import javax.persistence.TemporalType;  
  10.   
  11. import org.junit.Test;  
  12. import org.zgf.jpa.enumer.Gender;  
  13. /** 
  14.  * JPA 中sql 语句设置参数有两种形式,一种是命名参数,另一种是位置参数: 
  15.  * 位置参数:执行效率高, 可读性差,可用于原生sql 和 JPQL 语句中, 格式《?+数字》,数字可任意指定  
  16.  * 命名参数:执行效率低 ,可读性强,可用于原生sql 和 JPQL 语句中, 格式《:+ 名称》,名称自定义 
  17.  *  
  18.  * @Description: 测试Query接口的相关API 
  19.  * @author zonggf 
  20.  * @date 2015年11月4日-下午4:07:12 
  21.  */  
  22. public class Test_QueryAPI extends BasicJPATest{  
  23.       
  24.     //2. Test API 1: 测试返回列表API  
  25.     @Test  
  26.     public void test_getResultList(){  
  27.         String jpql = "from PersonEntity";  
  28.         Query query = this.entityManager.createQuery(jpql);  
  29.         List<PersonEntity> personEntityList = query.getResultList();  
  30.         for (PersonEntity personEntity : personEntityList) {  
  31.             System.out.println(personEntity);  
  32.         }  
  33.     }  
  34.       
  35.     //2. Test API 2: 使用query.getSingleResult()方式时,必须保证查询的结果有且只有一个返回对象  
  36.     @Test  
  37.     public void test_getSingleResult(){  
  38.         String jpql = "from PersonEntity personEntity where personEntity.id = 1";  
  39.         Query query =  this.entityManager.createQuery(jpql);  
  40.         PersonEntity personEntity = (PersonEntity) query.getSingleResult();  
  41.         System.out.println(personEntity);  
  42.     }  
  43.       
  44.     //2. Test API 2: 如果没有返回对象,则会抛出异常 NoResultException.class  
  45.     @Test(expected=javax.persistence.NoResultException.class)  
  46.     public void test_getSingleResult_Exception(){  
  47.         String jpql = "from PersonEntity personEntity where personEntity.id = 100";  
  48.         Query query =  this.entityManager.createQuery(jpql);  
  49.         PersonEntity personEntity = (PersonEntity) query.getSingleResult();  
  50.         System.out.println(personEntity);  
  51.     }  
  52.       
  53.     //2. Test API 2: 如果有多个返回对象,则会抛出异常 NonUniqueResultException.class  
  54.     @Test(expected=javax.persistence.NonUniqueResultException.class)  
  55.     public void test_getSingleResult_Exception_(){  
  56.         String jpql = "from PersonEntity";  
  57.         Query query =  this.entityManager.createQuery(jpql);  
  58.         PersonEntity personEntity = (PersonEntity) query.getSingleResult();  
  59.         System.out.println(personEntity);  
  60.     }  
  61.       
  62.       
  63.     //3. Test API 3: 测试位置参数使用方法  
  64.     @Test  
  65.     public void test_setPositionParameter(){  
  66.         String jpql = "from PersonEntity personEntity where personEntity.id = ?1";  
  67.         Query query = this.entityManager.createQuery(jpql);  
  68.         query.setParameter(11);  
  69.         PersonEntity personEntity = (PersonEntity) query.getSingleResult();  
  70.         System.out.println(personEntity);  
  71.           
  72.     }  
  73.       
  74.     //3. Test API 3: 测试位置参数使用方法,参数类型为java.util.Date  
  75.     @Test  
  76.     public void test_setPositionParameter_date(){  
  77.         String sql = "select count(*) from tb_person p where p.birthdayDate = ?2";  
  78.         Query query = this.entityManager.createNativeQuery(sql);  
  79.         query.setParameter(2,new Date(), TemporalType.DATE);  
  80.         //注意此处返回的是BigInteger 类型, 不是Int类型  
  81.         BigInteger count = (BigInteger) query.getSingleResult();  
  82.         System.out.println("共有记录:" + count);  
  83.     }  
  84.       
  85.     //3. Test API 3: 测试位置参数使用方法, 参数类型为 java.util.Calendar;  
  86.     @Test  
  87.     public void test_setPositionParameter_calender(){  
  88.         String sql = "select count(*) from tb_person p where p.birthdayDate = ?2";  
  89.         Query query = this.entityManager.createNativeQuery(sql);  
  90.         query.setParameter(2,Calendar.getInstance(), TemporalType.DATE);  
  91.         //注意此处返回的是BigInteger 类型, 不是Int类型  
  92.         BigInteger count = (BigInteger) query.getSingleResult();  
  93.         System.out.println("共有记录:" + count);  
  94.     }  
  95.       
  96.     //Test API 4: 测试命名参数:参数类型为普通参数  
  97.     @Test  
  98.     public void test_setNameParameter(){  
  99.         String jpql = "from PersonEntity personEntity where personEntity.id = :id";  
  100.         Query query = this.entityManager.createQuery(jpql);  
  101.         query.setParameter("id"1);  
  102.         PersonEntity personEntity = (PersonEntity) query.getSingleResult();  
  103.         System.out.println(personEntity);  
  104.     }  
  105.       
  106.     //Test API 4: 测试命名参数:参数类型为java.util.Date  
  107.     @Test  
  108.     public void test_setNameParameter_date(){  
  109.         String sql = "select count(*) from tb_person p where p.birthdayDate = :birthDate";  
  110.         Query query = this.entityManager.createNativeQuery(sql);  
  111.         query.setParameter("birthDate",new Date(), TemporalType.DATE);  
  112.         //注意此处返回的是BigInteger 类型, 不是Int类型  
  113.         BigInteger count = (BigInteger) query.getSingleResult();  
  114.         System.out.println("共有记录:" + count);  
  115.     }  
  116.       
  117.     //Test API 4: 测试命名参数:参数类型为java.util.Calendar  
  118.     @Test  
  119.     public void test_setNameParameter_calender(){  
  120.         String sql = "select count(*) from tb_person p where p.birthdayDate = :birthDate";  
  121.         Query query = this.entityManager.createNativeQuery(sql);  
  122.         query.setParameter("birthDate",Calendar.getInstance(), TemporalType.DATE);  
  123.         //注意此处返回的是BigInteger 类型, 不是Int类型  
  124.         BigInteger count = (BigInteger) query.getSingleResult();  
  125.         System.out.println("共有记录:" + count);  
  126.     }  
  127.       
  128.     //Test API 5: excuteUpdate 用于执行更新更新,删除语句或者DDL语句  
  129.     @Test  
  130.     public void test_excuteUpdate_clear(){  
  131.         String jpql = "delete PersonEntity";  
  132.         Query query = this.entityManager.createQuery(jpql);  
  133.         int deleteCnt = query.executeUpdate();  
  134.         System.out.println("共删除记录条数:" + deleteCnt);  
  135.     }  
  136.       
  137.     //Test API 5: excuteUpdate 执行DDL 语句删除表  
  138.     @Test  
  139.     public void test_excuteUpdate_drop(){  
  140.         String sql = "drop table tb_person";  
  141.         Query query = this.entityManager.createNativeQuery(sql);  
  142.         int cnt = query.executeUpdate();  
  143.         System.out.println("cnt:" + cnt);  
  144.     }  
  145.       
  146.     //Test API 6: 测试分页数据  
  147.     @Test  
  148.     public void test_page(){  
  149.         String jpql = "from PersonEntity";  
  150.         Query query = this.entityManager.createQuery(jpql);  
  151.         query.setFirstResult(10); //序号从0 开始  
  152.         query.setMaxResults(20);  
  153.         List<PersonEntity> personList = query.getResultList();  
  154.         System.out.println("count:" + personList.size());  
  155.         for (PersonEntity personEntity : personList) {  
  156.             System.out.println(personEntity);  
  157.         }  
  158.     }  
  159.       
  160.     //初始化100 条数据  
  161.     @Test  
  162.     public void test_savePerson(){  
  163.         Date date = new Date();  
  164.         for(int i=0; i<100;  i++){  
  165.             PersonEntity person = new PersonEntity();  
  166.             person.setName("zhangsan" + i);  
  167.             person.setAge(20);  
  168.             person.setBirthday(date);  
  169.             person.setBirthdayDate(date);  
  170.             person.setBirthdayTime(date);  
  171.             person.setEnglishScore(20.20);  
  172.             person.setMathScore(89.8f);  
  173.             person.setGender(Gender.BOY);  
  174.             person.setInfo("I am a good boy".getBytes());  
  175.             this.entityManager.persist(person);  
  176.         }  
  177.     }  
  178.       
  179. }  
其它涉及类PersonEntity, BasicJPATest 参看《JPA 学习篇(三)简单实体类映射和EntityManager API》

【注意】

1.  JPA 中sql 语句设置参数有两种形式,一种是命名参数,另一种是位置参数:

     位置参数:执行效率高, 可读性差,可用于原生sql 和 JPQL 语句中, 格式《?+数字》,数字可任意指定 也可以不指定,直接用问号
     命名参数:执行效率低 ,可读性强,可用于原生sql 和 JPQL 语句中, 格式《:+ 名称》,名称自定义

2. query.getSigleResult(); 方法必须确保查询结果有且只有一个放回对象。

3. query.excuteUpdate();方法可用于执行更新,删除语句,

相关文章:

  • 2021-06-09
  • 2021-08-25
  • 2022-01-19
  • 2022-12-23
  • 2022-12-23
  • 2021-08-15
  • 2021-06-18
  • 2021-11-01
猜你喜欢
  • 2021-12-18
  • 2022-01-03
  • 2021-08-25
  • 2021-11-30
  • 2022-12-23
  • 2021-06-25
相关资源
相似解决方案