【Query 接口下的常用API】
【API 测试类:Test_QueryAPI.Java】
[java]
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. "from PersonEntity";
28. 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. "from PersonEntity personEntity where personEntity.id = 1";
39. 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. "from PersonEntity personEntity where personEntity.id = 100";
48. 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. "from PersonEntity";
57. 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. "from PersonEntity personEntity where personEntity.id = ?1";
67. this.entityManager.createQuery(jpql);
68. 1, 1);
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. "select count(*) from tb_person p where p.birthdayDate = ?2";
78. this.entityManager.createNativeQuery(sql);
79. 2,new Date(), TemporalType.DATE);
80. //注意此处返回的是BigInteger 类型, 不是Int类型
81. BigInteger count = (BigInteger) query.getSingleResult();
82. "共有记录:" + count);
83. }
84.
85. //3. Test API 3: 测试位置参数使用方法, 参数类型为 java.util.Calendar;
86. @Test
87. public void test_setPositionParameter_calender(){
88. "select count(*) from tb_person p where p.birthdayDate = ?2";
89. this.entityManager.createNativeQuery(sql);
90. 2,Calendar.getInstance(), TemporalType.DATE);
91. //注意此处返回的是BigInteger 类型, 不是Int类型
92. BigInteger count = (BigInteger) query.getSingleResult();
93. "共有记录:" + count);
94. }
95.
96. //Test API 4: 测试命名参数:参数类型为普通参数
97. @Test
98. public void test_setNameParameter(){
99. "from PersonEntity personEntity where personEntity.id = :id";
100. this.entityManager.createQuery(jpql);
101. "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. "select count(*) from tb_person p where p.birthdayDate = :birthDate";
110. this.entityManager.createNativeQuery(sql);
111. "birthDate",new Date(), TemporalType.DATE);
112. //注意此处返回的是BigInteger 类型, 不是Int类型
113. BigInteger count = (BigInteger) query.getSingleResult();
114. "共有记录:" + count);
115. }
116.
117. //Test API 4: 测试命名参数:参数类型为java.util.Calendar
118. @Test
119. public void test_setNameParameter_calender(){
120. "select count(*) from tb_person p where p.birthdayDate = :birthDate";
121. this.entityManager.createNativeQuery(sql);
122. "birthDate",Calendar.getInstance(), TemporalType.DATE);
123. //注意此处返回的是BigInteger 类型, 不是Int类型
124. BigInteger count = (BigInteger) query.getSingleResult();
125. "共有记录:" + count);
126. }
127.
128. //Test API 5: excuteUpdate 用于执行更新更新,删除语句或者DDL语句
129. @Test
130. public void test_excuteUpdate_clear(){
131. "delete PersonEntity";
132. this.entityManager.createQuery(jpql);
133. int deleteCnt = query.executeUpdate();
134. "共删除记录条数:" + deleteCnt);
135. }
136.
137. //Test API 5: excuteUpdate 执行DDL 语句删除表
138. @Test
139. public void test_excuteUpdate_drop(){
140. "drop table tb_person";
141. this.entityManager.createNativeQuery(sql);
142. int cnt = query.executeUpdate();
143. "cnt:" + cnt);
144. }
145.
146. //Test API 6: 测试分页数据
147. @Test
148. public void test_page(){
149. "from PersonEntity";
150. this.entityManager.createQuery(jpql);
151. 10); //序号从0 开始
152. 20);
153. List<PersonEntity> personList = query.getResultList();
154. "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. new Date();
164. for(int i=0; i<100; i++){
165. new PersonEntity();
166. "zhangsan" + i);
167. 20);
168. person.setBirthday(date);
169. person.setBirthdayDate(date);
170. person.setBirthdayTime(date);
171. 20.20);
172. 89.8f);
173. person.setGender(Gender.BOY);
174. "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();方法可用于执行更新,删除语句,