SpringDataJPA--JPA复杂查询

JPA中的复杂查询

JPQL全称Java Persistence Query Language

基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。

其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

jpql和sql语句的区别

  • sql:查询的是表和表中的字段
  • jpql:查询的是实体类和类中的属性
  • jpql和sql语句的语法相似。

进行jpql查询

  1. 创建query查询对象
  2. 对参数进行赋值
  3. 查询,并得到返回结果
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();
    }
注意,jpql语句不支持select * 的写法
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值