一、HQL的查询
1、hibernate查询涉及的对象
Query对象
2、如何获取Query对象
session.createQuery(String hql);
3、什么是HQL
hibernate query language
它就是把sql语句中的表名换成了实体类名。把表中的列名换成了实体类中的属性名。
select * 可以省略。
4、基本用法:查询所有
/**
* 查询所有客户
*/
@Test
public 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开始的
*/
@Test
public 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();
}
/**
* 条件查询的第二种提供占位符的方式
* 具名查询:
* 具名:给参数提供一个具体的名称,而不是用问号作为占位符
* 提供名称的规则:
* :名称
* 给占位符赋值:
* 直接写具体的名称。不能写:
*/
@Test
public 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
*/
@Test
public 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();此方法用于设置每次查询的条数
*/
@Test
public 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
*/
@Test
public 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、实体类要求:
* 必须生成对应参数列表的构造函数
*/
@Test
public 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、查询所有
/**
* 查询所有客户
*/
@Test
public 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、条件查询
/**
* 条件查询
*/
@Test
public 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、排序查询
/**
* 排序查询
*/
@Test
public 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语句所涉及的方法是一模一样的
*
*/
@Test
public 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中使用聚合函数)
*/
@Test
public void test5(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Criteria对象
Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer
//2.在Criteria对象中设置Projection
c.setProjection(Projections.count("custId"));
//3.获取结果集
Object obj = c.uniqueResult();
System.out.println(obj);
tx.commit();
}