JPQL查询
1 jpql的介绍
sql:查询的是表和表中的字段。
jpql:查询的是实体类和类中的属性。
jpql和sql语句的语法相似。
JPQL全称Java Persistence Query Language
基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起•使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。
2 查询全部
编写测试代码如下:
package com.txw.test;import com.txw.utils.JpaUtils;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List;
/*** 测试jqpl* @author: Adair*/
@SuppressWarnings("all") // 注解警告信息
public class JpqlTest {/*** 查询全部* jqpl:from com.txw.domain.Customer* sql:SELECT * FROM cst_customer*/@Testpublic void testFindAll() {// 1.获取entityManager对象EntityManager em = JpaUtils.getEntityManager();// 获取事务对象EntityTransaction tx = em.getTransaction();// 2.开启事务tx.begin();// 3.查询全部String jpql = "from com.txw.domain.Customer";// 创建Query查询对象,query对象才是执行jqpl的对象Query query = em.createQuery(jpql);// 发送查询,并封装结果集List list = query.getResultList();for (Object obj : list) {System.out.println(obj);}// 4.提交事务tx.commit();// 5.释放资源em.close();}
}
运行结果如图所示:
3 排序
编写测试的代码如下:
package com.txw.test;import com.txw.utils.JpaUtils;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List;
/*** 测试jqpl* @author: Adair*/
@SuppressWarnings("all") // 注解警告信息
public class JpqlTest {/*** 排序查询: 倒序查询全部客户(根据id倒序)* sql:SELECT * FROM cst_customer ORDER BY cust_id DESC* jpql:from Customer order by custId desc* 进行jpql查询* 1.创建query查询对象* 2.对参数进行赋值* 3.查询,并得到返回结果*/@Testpublic void testFindAll() {// 1.获取entityManager对象EntityManager em = JpaUtils.getEntityManager();// 获取事务对象EntityTransaction tx = em.getTransaction();// 2.开启事务tx.begin();// 3.查询全部String jpql = "from Customer order by custId desc";// 创建Query查询对象,query对象才是执行jqpl的对象Query query = em.createQuery(jpql);// 发送查询,并封装结果集List list = query.getResultList();for (Object obj : list) {System.out.println(obj);}// 4.提交事务tx.commit();// 5.释放资源em.close();}
}
运行结果如图所示:
4 统计查询
编写测试的代码如下:
package com.txw.test;import com.txw.utils.JpaUtils;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List;
/*** 测试jqpl* @author: Adair*/
@SuppressWarnings("all") // 注解警告信息
public class JpqlTest {/*** 使用jpql查询,统计客户的总数* sql:SELECT COUNT(cust_id) FROM cst_customer* jpql:select count(custId) from Customer*/@Testpublic void testCount() {// 1.获取entityManager对象EntityManager em = JpaUtils.getEntityManager();// 获取事务对象EntityTransaction tx = em.getTransaction();// 2.开启事务tx.begin();// 3.查询全部// 根据jpql语句创建Query查询对象String jpql = "select count(custId) from Customer";Query query = em.createQuery(jpql);// 对参数赋值// 发送查询,并封装结果/*** getResultList : 直接将查询结果封装为list集合* getSingleResult : 得到唯一的结果集*/Object result = query.getSingleResult();System.out.println(result);// 4.提交事务tx.commit();// 5.释放资源em.close();}
}
运行结果如图所示:
5 分页查询
编写测试的代码如下:
package com.txw.test;import com.txw.utils.JpaUtils;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List;
/*** 测试jqpl* @author: Adair*/
@SuppressWarnings("all") // 注解警告信息
public class JpqlTest {/*** 分页查询* sql:select * from cst_customer limit 0,2* jqpl : from Customer*/@Testpublic void testPaged() {// 1.获取entityManager对象EntityManager em = JpaUtils.getEntityManager();// 获取事务对象EntityTransaction tx = em.getTransaction();// 2.开启事务tx.begin();// 3.查询全部// 根据jpql语句创建Query查询对象String jpql = "from Customer";Query query = em.createQuery(jpql);// 对参数赋值 -- 分页参数// 起始索引query.setFirstResult(0);//每页查询的条数query.setMaxResults(2);// 发送查询,并封装结果/*** getResultList : 直接将查询结果封装为list集合* getSingleResult : 得到唯一的结果集*/List list = query.getResultList();for(Object obj : list) {System.out.println(obj);}// 4.提交事务tx.commit();// 5.释放资源em.close();}
}
运行结果如图所示:
6 条件查询
编写测试的代码如下:
package com.txw.test;import com.txw.utils.JpaUtils;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List;
/*** 测试jqpl* @author: Adair*/
@SuppressWarnings("all") // 注解警告信息
public class JpqlTest {/*** 条件查询* 案例:查询客户名称以‘学无止路’开头的客户* sql:SELECT * FROM cst_customer WHERE cust_name LIKE ?* jpql : from Customer where custName like ?*/@Testpublic void testCondition() {// 1.获取entityManager对象EntityManager em = JpaUtils.getEntityManager();// 获取事务对象EntityTransaction tx = em.getTransaction();// 2.开启事务tx.begin();// 3.查询全部// 根据jpql语句创建Query查询对象String jpql = "from Customer where custName like ? ";Query query = em.createQuery(jpql);// 对参数赋值 -- 占位符参数//第一个参数:占位符的索引位置(从1开始),第二个参数:取值query.setParameter(1,"学无止路%");// 发送查询,并封装结果/*** getResultList : 直接将查询结果封装为list集合* getSingleResult : 得到唯一的结果集*/List list = query.getResultList();for(Object obj : list) {System.out.println(obj);}// 4.提交事务tx.commit();// 5.释放资源em.close();}
}
运行结果如图所示: