JPA 学习篇(四)Query接口下的 API 测试
2015-11-04 17:27
417 查看
【Query 接口下的常用API】
【API 测试类:Test_QueryAPI.java】
其它涉及类PersonEntity, BasicJPATest 参看《JPA 学习篇(三)简单实体类映射和EntityManager API》
【注意】
1. JPA 中sql 语句设置参数有两种形式,一种是命名参数,另一种是位置参数:
位置参数:执行效率高, 可读性差,可用于原生sql 和 JPQL 语句中, 格式《?+数字》,数字可任意指定 也可以不指定,直接用问号
命名参数:执行效率低 ,可读性强,可用于原生sql 和 JPQL 语句中, 格式《:+ 名称》,名称自定义
2. query.getSigleResult(); 方法必须确保查询结果有且只有一个放回对象。
3. query.excuteUpdate();方法可用于执行更新,删除语句,
4. 源代码下载【D_JPA_02_简单实体映射和API.zip】
【API 测试类:Test_QueryAPI.java】
package org.zgf.jpa.entity; import java.math.BigInteger; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.persistence.Query; import javax.persistence.TemporalType; import org.junit.Test; import org.zgf.jpa.enumer.Gender; /** * JPA 中sql 语句设置参数有两种形式,一种是命名参数,另一种是位置参数: * 位置参数:执行效率高, 可读性差,可用于原生sql 和 JPQL 语句中, 格式《?+数字》,数字可任意指定 * 命名参数:执行效率低 ,可读性强,可用于原生sql 和 JPQL 语句中, 格式《:+ 名称》,名称自定义 * * @Description: 测试Query接口的相关API * @author zonggf * @date 2015年11月4日-下午4:07:12 */ public class Test_QueryAPI extends BasicJPATest{ //2. Test API 1: 测试返回列表API @Test public void test_getResultList(){ String jpql = "from PersonEntity"; Query query = this.entityManager.createQuery(jpql); List<PersonEntity> personEntityList = query.getResultList(); for (PersonEntity personEntity : personEntityList) { System.out.println(personEntity); } } //2. Test API 2: 使用query.getSingleResult()方式时,必须保证查询的结果有且只有一个返回对象 @Test public void test_getSingleResult(){ String jpql = "from PersonEntity personEntity where personEntity.id = 1"; Query query = this.entityManager.createQuery(jpql); PersonEntity personEntity = (PersonEntity) query.getSingleResult(); System.out.println(personEntity); } //2. Test API 2: 如果没有返回对象,则会抛出异常 NoResultException.class @Test(expected=javax.persistence.NoResultException.class) public void test_getSingleResult_Exception(){ String jpql = "from PersonEntity personEntity where personEntity.id = 100"; Query query = this.entityManager.createQuery(jpql); PersonEntity personEntity = (PersonEntity) query.getSingleResult(); System.out.println(personEntity); } //2. Test API 2: 如果有多个返回对象,则会抛出异常 NonUniqueResultException.class @Test(expected=javax.persistence.NonUniqueResultException.class) public void test_getSingleResult_Exception_(){ String jpql = "from PersonEntity"; Query query = this.entityManager.createQuery(jpql); PersonEntity personEntity = (PersonEntity) query.getSingleResult(); System.out.println(personEntity); } //3. Test API 3: 测试位置参数使用方法 @Test public void test_setPositionParameter(){ String jpql = "from PersonEntity personEntity where personEntity.id = ?1"; Query query = this.entityManager.createQuery(jpql); query.setParameter(1, 1); PersonEntity personEntity = (PersonEntity) query.getSingleResult(); System.out.println(personEntity); } //3. Test API 3: 测试位置参数使用方法,参数类型为java.util.Date @Test public void test_setPositionParameter_date(){ String sql = "select count(*) from tb_person p where p.birthdayDate = ?2"; Query query = this.entityManager.createNativeQuery(sql); query.setParameter(2,new Date(), TemporalType.DATE); //注意此处返回的是BigInteger 类型, 不是Int类型 BigInteger count = (BigInteger) query.getSingleResult(); System.out.println("共有记录:" + count); } //3. Test API 3: 测试位置参数使用方法, 参数类型为 java.util.Calendar; @Test public void test_setPositionParameter_calender(){ String sql = "select count(*) from tb_person p where p.birthdayDate = ?2"; Query query = this.entityManager.createNativeQuery(sql); query.setParameter(2,Calendar.getInstance(), TemporalType.DATE); //注意此处返回的是BigInteger 类型, 不是Int类型 BigInteger count = (BigInteger) query.getSingleResult(); System.out.println("共有记录:" + count); } //Test API 4: 测试命名参数:参数类型为普通参数 @Test public void test_setNameParameter(){ String jpql = "from PersonEntity personEntity where personEntity.id = :id"; Query query = this.entityManager.createQuery(jpql); query.setParameter("id", 1); PersonEntity personEntity = (PersonEntity) query.getSingleResult(); System.out.println(personEntity); } //Test API 4: 测试命名参数:参数类型为java.util.Date @Test public void test_setNameParameter_date(){ String sql = "select count(*) from tb_person p where p.birthdayDate = :birthDate"; Query query = this.entityManager.createNativeQuery(sql); query.setParameter("birthDate",new Date(), TemporalType.DATE); //注意此处返回的是BigInteger 类型, 不是Int类型 BigInteger count = (BigInteger) query.getSingleResult(); System.out.println("共有记录:" + count); } //Test API 4: 测试命名参数:参数类型为java.util.Calendar @Test public void test_setNameParameter_calender(){ String sql = "select count(*) from tb_person p where p.birthdayDate = :birthDate"; Query query = this.entityManager.createNativeQuery(sql); query.setParameter("birthDate",Calendar.getInstance(), TemporalType.DATE); //注意此处返回的是BigInteger 类型, 不是Int类型 BigInteger count = (BigInteger) query.getSingleResult(); System.out.println("共有记录:" + count); } //Test API 5: excuteUpdate 用于执行更新更新,删除语句或者DDL语句 @Test public void test_excuteUpdate_clear(){ String jpql = "delete PersonEntity"; Query query = this.entityManager.createQuery(jpql); int deleteCnt = query.executeUpdate(); System.out.println("共删除记录条数:" + deleteCnt); } //Test API 5: excuteUpdate 执行DDL 语句删除表 @Test public void test_excuteUpdate_drop(){ String sql = "drop table tb_person"; Query query = this.entityManager.createNativeQuery(sql); int cnt = query.executeUpdate(); System.out.println("cnt:" + cnt); } //Test API 6: 测试分页数据 @Test public void test_page(){ String jpql = "from PersonEntity"; Query query = this.entityManager.createQuery(jpql); query.setFirstResult(10); //序号从0 开始 query.setMaxResults(20); List<PersonEntity> personList = query.getResultList(); System.out.println("count:" + personList.size()); for (PersonEntity personEntity : personList) { System.out.println(personEntity); } } //初始化100 条数据 @Test public void test_savePerson(){ Date date = new Date(); for(int i=0; i<100; i++){ PersonEntity person = new PersonEntity(); person.setName("zhangsan" + i); person.setAge(20); person.setBirthday(date); person.setBirthdayDate(date); person.setBirthdayTime(date); person.setEnglishScore(20.20); person.setMathScore(89.8f); person.setGender(Gender.BOY); person.setInfo("I am a good boy".getBytes()); this.entityManager.persist(person); } } }
其它涉及类PersonEntity, BasicJPATest 参看《JPA 学习篇(三)简单实体类映射和EntityManager API》
【注意】
1. JPA 中sql 语句设置参数有两种形式,一种是命名参数,另一种是位置参数:
位置参数:执行效率高, 可读性差,可用于原生sql 和 JPQL 语句中, 格式《?+数字》,数字可任意指定 也可以不指定,直接用问号
命名参数:执行效率低 ,可读性强,可用于原生sql 和 JPQL 语句中, 格式《:+ 名称》,名称自定义
2. query.getSigleResult(); 方法必须确保查询结果有且只有一个放回对象。
3. query.excuteUpdate();方法可用于执行更新,删除语句,
4. 源代码下载【D_JPA_02_简单实体映射和API.zip】
相关文章推荐
- UILabel 和UIButton的简单实用
- uiCoder界面代码生成工具 part1 概述+图片制作
- The JSP specification requires that an attribute name is preceded by whitespace异常
- IQueryable接口与IEnumberable 区别
- Android设计模式——Builder模式
- TrueCrypt的安装和使用
- UIImage部分拉伸——stretchableImageWithLeftCapWidth的使用
- Longest Increasing Subsequence的两种解法
- UITableViewStyleGrouped和plain的两种格式的区别
- Ext中关于Ext.QuickTips.init()的使用
- media query 代码实例
- does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), o
- android CTS-- android.os.cts.BuildVersionTest#testBuildFingerprint fail
- UIView的属性使用
- AMD,CMD,CommonJS以及RequireJS和SeaJS的个人感悟
- SynchronousQueue 的联想
- UIPageControl分页控件多图实现
- PriorityQueue 源代码
- the key specified to compute a hash value is expired
- UINavigationController返回前面界面的几种方法