Hibernate学习笔记 -- day07 HQL、QBC查询用法

来源:互联网 发布:html5个人网站源码 编辑:程序博客网 时间:2024/05/17 04:15

一、HQL的查询

1、hibernate查询涉及的对象

        Query对象

2、如何获取Query对象

        session.createQuery(String hql);

3、什么是HQL

        hibernate query language

        它就是把sql语句中的表名换成了实体类名。把表中的列名换成了实体类中的属性名。

         select * 可以省略。

4、基本用法:查询所有

/** * 查询所有客户 */@Testpublic void test1(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("from Customer");//2.把查询结果封装到结果集中List list = query.list();for(Object o : list){System.out.println(o);}tx.commit();}

5、带条件查询

/** * 条件查询 * hibernate中参数占位符的索引是从0开始的 */@Testpublic void test2(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("from Customer where custIndustry like ?  and custName like ? ");//2.给参数占位符赋值query.setString(0, "%修%");query.setString(1, "%办公%");//3.把查询结果封装到结果集中List list = query.list();for(Object o : list){System.out.println(o);}tx.commit();}/** * 条件查询的第二种提供占位符的方式 * 具名查询: * 具名:给参数提供一个具体的名称,而不是用问号作为占位符 * 提供名称的规则: * :名称 * 给占位符赋值: * 直接写具体的名称。不能写: */@Testpublic void test3(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("from Customer where custIndustry like :a  and custName like :custName ");//2.给参数占位符赋值query.setString("custName", "%修%");query.setString("a", "%办公%");//3.把查询结果封装到结果集中List list = query.list();for(Object o : list){System.out.println(o);}tx.commit();}

6、排序查询

关键字:order  by

/** * 排序查询 *  * 关键字: * order by * 升序: * asc 默认值 * 降序 * desc  */@Testpublic void test4(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("from Customer order by custId desc ");//2.把查询结果封装到结果集中List list = query.list();for(Object o : list){System.out.println(o);}tx.commit();}

7、分页查询

hibernate中提供了两个方法分别放起始页,和每页显示条数

/** * 分页查询 *  * mysql分页的关键字: * limit * limit关键字有两个参数 * 第一个参数:查询的开始记录索引,从0开始 * 第二个参数:每次查询多少条记录。 * 在hibernate中它提供了两个方法: * setFirstResult();此方法用于设置开始记录索引 * setMaxResults();此方法用于设置每次查询的条数 */@Testpublic void test5(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("from Customer");//2.设置分页的条件query.setFirstResult(2);query.setMaxResults(2);//3.把查询结果封装到结果集中List list = query.list();for(Object o : list){System.out.println(o);}tx.commit();}

8、HQL中聚合函数的用法

注意:在使用聚合函数时,没有group by子句的情况下,返回的结果都是一行一列的。

/** * HQL中的聚合函数用法: * 明确: * 在使用聚合函数时,没有group by子句的情况下,返回的结果都是一行一列的。 * 聚合函数: * count * max *  min *  avg *  sum */@Testpublic void test6(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("select count(custId) from Customer");//2.获取结果集Object obj = query.uniqueResult();System.out.println(obj);tx.commit();}

9、投影查询

什么是投影查询:

        我们查询一个实体列表时,并不是获取所有字段的信息,只是部分字段。但是还要把部分字段的信息重新封装到实体类中。就叫做创建实体类的投影。

使用要求:

        HQL要求:语句中必须有 new 关键词

                select new cn.itcast.domain.Customer(custId,custName) from Customer;

        实体类要求:必须生成对应参数列表的构造函数

/** * 投影查询: *  我们查询一个实体列表时,并不是获取所有字段的信息,只是部分字段。 * 但是还要把部分字段的信息重新封装到实体类中。 *  就叫做创建实体类的投影。 * 使用要求: * 1、HQL语句: * select new cn.itcast.domain.Customer(custId,custName) from Customer; *  2、实体类要求: *  必须生成对应参数列表的构造函数 */@Testpublic void test7(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Query对象Query query = s.createQuery("select new Customer(custId,custName) from Customer");//2.获取结果集/*List<Object[]> list = query.list();for(Object[] os : list){System.out.println("数组中的内容-------------------");for(Object o : os){System.out.println(o);}}*/List list = query.list();for(Object o : list){System.out.println(o);}tx.commit();}

三、Criteria对象的查询

1、涉及的对象

       Criteria对象

2、如何获取对象

        session.createCriteria(Class clazz);

3、参数的含义

        要查询的实体类字节码对象

4、QBC查询

        使用Criteria对象查询,Query By Criteria

        特点:一句SQL语句或者HQL语句都不需要。是把生成语句的过程都通过调用方法来表现出来了。凡是能用HQL查询的,QBC都能查,反之亦然。

5、查询所有

/** * 查询所有客户 */@Testpublic void test1(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Criteria对象Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer//2.获取结果集List list = c.list();for(Object o : list){System.out.println(o);}tx.commit();}

6、条件查询

/** * 条件查询 */@Testpublic void test2(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Criteria对象Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer//2.设置查询条件c.add(Restrictions.like("custName", "%修%"));//from Customer where custName like '%修%'c.add(Restrictions.eq("custIndustry","商业办公"));//3.获取结果集List list = c.list();for(Object o : list){System.out.println(o);}tx.commit();}

7、排序查询

/** * 排序查询 */@Testpublic void test3(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Criteria对象Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer//2.设置排序c.addOrder(Order.desc("custId"));//3.获取结果集List list = c.list();for(Object o : list){System.out.println(o);}tx.commit();}

8、分页查询

/** * 分页查询 * 它和HQL语句所涉及的方法是一模一样的 *  */@Testpublic void test4(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Criteria对象Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer//2.设置分页的条件c.setFirstResult(2);c.setMaxResults(2);//3.获取结果集List list = c.list();for(Object o : list){System.out.println(o);}tx.commit();}

9、统计查询

/** * 统计查询(在QBC中使用聚合函数) */@Testpublic void test5(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();//1.获取Criteria对象Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer//2.在Criteria对象中设置Projectionc.setProjection(Projections.count("custId"));//3.获取结果集Object obj = c.uniqueResult();System.out.println(obj);tx.commit();}

四、QBC常用条件查询说明





原创粉丝点击