JPA中的复杂查询
JPQL全称Java Persistence Query Language
基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。
jpql和sql语句的区别
- sql:查询的是表和表中的字段
- jpql:查询的是实体类和类中的属性
- jpql和sql语句的语法相似。
进行jpql查询
- 创建query查询对象
- 对参数进行赋值
- 查询,并得到返回结果
1.1查询全部
/**
* 查询全部
* jpql: from cn.itcast.domain.Customer
* sql: SELECT * FROM cst_customer
*/
@Test
public void testFindAll(){
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.查询全部
//String jpql = "from cn.itcast.domain.Customer";等价于下面
String jpql = "from Customer";
Query query = em.createQuery(jpql); //创建Query查询对象,query对象才是执行jpql的对象
//发送查询,并封装结果集
List list = query.getResultList();
for (Object o : list) {
System.out.println(o);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
1.2倒序查询
/**
* 倒序查询
* jpql: from Customer order by cust_id desc
* sql: SELECT * FROM cst_customer ORDER BY cust_id DESC
*/
@Test
public void testOrders(){
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.倒序查询
String jpql = "from Customer order by cust_id desc";
Query query = em.createQuery(jpql); //创建Query查询对象,query对象才是执行jpql的对象
//发送查询,并封装结果集
List list = query.getResultList();
for (Object o : list) {
System.out.println(o);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
1.3 统计查询
/**
* 使用jpql查询,统计客户的总数
* jpql: SELECT COUNT(cust_id) FROM Customer;
* sql: SELECT COUNT(cust_id) FROM cst_customer;
*/
@Test
public void testCount(){
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.使用jpql查询,统计客户的总数
String jpql = " SELECT COUNT(cust_id) FROM Customer";
Query query = em.createQuery(jpql); //创建Query查询对象,query对象才是执行jpql的对象
//发送查询,并封装结果集
/**
* getResultList: 直接将查询结果封装为list集合
* getSingleResult: 得到唯一的结果集
* */
Object result= query.getSingleResult();
System.out.println(result);
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
1.4分页查询
/**
* 分页查询:
* sql: select * from cst_customer limit ?,?
* jpql: from Customer
*/
@Test
public void testPaged(){
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.使用jpql查询,分页查询
String jpql = " from Customer";
Query query = em.createQuery(jpql); //创建Query查询对象,query对象才是执行jpql的对象
//对参数赋值 -- 分页参数
//起始索引
query.setFirstResult(0);
//每页查询的条数
query.setMaxResults(2);
//发送查询,并封装结果集
/**
* getResultList: 直接将查询结果封装为list集合
* getSingleResult: 得到唯一的结果集
* */
List list= query.getResultList();
for (Object o : list) {
System.out.println(o);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
}
1.5 条件查询
/**
* 条件查询:
* 案例:查询客户名称以"仙女"开头的用户
* sql: select * from cst_customer where cust_name like ?
* jpql: from Customer where cust_name like ?
*/
@Test
public void testCondition(){
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.使用jpql查询,条件查询
String jpql = "from Customer where cust_name like ?";
Query query = em.createQuery(jpql); //创建Query查询对象,query对象才是执行jpql的对象
//对参数赋值 -- 占位符参数
//第一个参数: 占位符的索引位置(从0开始),第二个参数:取值
query.setParameter(0, "小鑫%");
//发送查询,并封装结果集
/**
* getResultList: 直接将查询结果封装为list集合
* getSingleResult: 得到唯一的结果集
* */
List list= query.getResultList();
for (Object o : list) {
System.out.println(o);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}