您的位置:首页 > 产品设计 > UI/UE

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

2017-08-14 16:14 411 查看
【Query 接口下的常用API】



【API 测试类:Test_QueryAPI.Java

[java] view
plain copy

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();方法可用于执行更新,删除语句,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  api jpa