Spring Data JPA(三)—— JPA复杂查询

2020-04-01

一、JPQL简介

  • JPAQL全称Java Persistence Query Language
  • 基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起,使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
  • 其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

SQL:查询的是表和表中的字段

JPQL:查新的是实体类和类中的属性

JPQL和SQL语句的语法类似

二、查询全部

  1. 获取EntityManager对象
  2. 开启事务
  3. 查询全部
  4. 提交事务
  5. 释放资源
/**
 * 查询全部
 * JPQL:from Customer
 * SQL:select * from tab_customer
 */
@Test
public void testFindAll(){
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    //jpql语句
    String jpql = "from Customer";
    //创建Query查询对象,query对象才是执行jpql的对象
    Query query = entityManager.createQuery(jpql);
    //发送查询,并封装结果集
    List list = query.getResultList();
    //打印结果
    for (Object obj : list) {
        System.out.println(obj);
    }
    tx.commit();
    entityManager.close();
}

三、排序查询

  1. 获取EntityManager对象
  2. 开启事务
  3. 倒叙查询全部
  4. 提交事务
  5. 释放资源
/**
 * 倒叙查询全部
 * JPQL:from Customer order by cust_id desc
 * SQL:select * from tab_customer order by custId desc
 */
@Test
public void testOrders() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    //jpql语句
    String jpql = "from Customer order by custId desc";
    //创建Query查询对象,query对象才是执行jpql的对象
    Query query = entityManager.createQuery(jpql);
    //发送查询,并封装结果集
    List list = query.getResultList();
    //打印结果
    for (Object obj : list) {
        System.out.println(obj);
    }
    tx.commit();
    entityManager.close();
}

四、统计查询

  1. 获取EntityManager对象
  2. 开启事务
  3. 查询总数
  4. 提交事务
  5. 释放资源
/**
 * 查询客户的总数
 * JPQL:select count(custId) from Customer
 * SQL:select count(cust_id) from tab_customer
 */
@Test
public void testCount() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    //jpql语句
    String jpql = "select count(custId) from Customer ";
    //创建Query查询对象,query对象才是执行jpql的对象
    Query query = entityManager.createQuery(jpql);
    //发送查询,并封装结果集
    Object result = query.getSingleResult();
    //打印结果
    System.out.println(result);
    tx.commit();
    entityManager.close();
}

五、分页查询

  1. 获取EntityManager对象
  2. 开启事务
  3. 分页查询
    1. 根据jpql语句创建Query查询对象
    2. 对参数赋值
  4. 提交事务
  5. 释放资源
/**
 * 分页查询
 * JPQL:from Customer
 * SQL:select * from tab_customer limit ?,?
 */
@Test
public void testPage() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    //jpql语句
    String jpql = "from Customer ";
    //创建Query查询对象,query对象才是执行jpql的对象
    Query query = entityManager.createQuery(jpql);
    //对参数赋值 -- 分页参数
    //起始索引
    query.setFirstResult(0);
    //每页查询条数
    query.setMaxResults(2);
    //发送查询,并封装结果集
    List list = query.getResultList();
    //打印结果
    for (Object obj : list) {
        System.out.println(obj);
    }
    tx.commit();
    entityManager.close();
}

六、条件查询

  1. 获取EntityManager对象
  2. 开启事务
  3. 条件查询
    1. 根据jpql语句创建Query查询对象
    2. 对参数赋值
  4. 提交事务
  5. 释放资源
/**
 * 案例:查询以test开头的客户
 * JPQL:from Customer where custName like ?1
 * SQL:select * from tab_customer where cust_name like 'test%'
 */
@Test
public void testCondition() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    //jpql语句
    String jpql = "from Customer where custName like ?1 ";
    //创建Query查询对象,query对象才是执行jpql的对象
    Query query = entityManager.createQuery(jpql);
    //对参数赋值 -- 占位符参数
    //第一个参数:占位符索引位置(从1开始),第二个参数:取值
    query.setParameter(1,"test%");
    //发送查询,并封装结果集
    List list = query.getResultList();
    //打印结果
    for (Object obj : list) {
        System.out.println(obj);
    }
    tx.commit();
    entityManager.close();
}

注意占位符后的数字,表明位置。(版本不同或有差异)


标题:Spring Data JPA(三)—— JPA复杂查询
作者:CherishVII
地址:https://cherishvii.com/articles/2020/04/01/1585736881909.html

评论
发表评论