Hibernate框架学习笔记——04

Hibernate查询方式

  • 对象导航查询
    ----根据id查询某个客户,再查询这个客户里面所有的联系人

  • OID查询
    ----根据id查询某一条记录,返回对象

  • HQL查询
    ----Query对象,写hql语句实现查询

  • QBC查询
    ----Criteria对象

  • 本地sql查询
    ----SQLQuery对象,使用普通sql实现查询

1.对象导航查询

例:查询某个客户里面所有联系人(一对多)过程,使用对象导航实现

//根据cid=1客户,再查询客户中所有联系人
Customer customer = session.get(Customer.class,1);
//查询这个客户的所有联系人
//直接得到客户里联系人的set集合
Set<LinkMan> linkman = customer.getLinkMan();

2.OID查询

根据id查询记录----调用session里面的get方法实现

//根据cid=1客户,再查询客户中所有联系人
Customer customer = session.get(Customer.class,1);

3.HQL查询

  1. hql:hibernate query language,hibernate提供一种查询语言,hql语言和普通sql很相似,区别:普通sql操作数据库表和字段,hql操作实体类和属性
  2. 常用的hql语句
    (1)查询所有: from 实体类名称
    (2)条件查询: from 实体类名称 where 属性名称=?
    (3)排序查询: from 实体类名称 order by 实体类属性名称 asc/desc
  3. 使用hql查询操作时候,使用Query对象
    (1)创建Query对象,写hql语句
    (2)调用query对象里面的方法得到结果
3.1HQL查询所有

例:查询所有客户记录
(1)创建Query对象,写hql语句
(2)调用query对象里面的方法得到结果

//1 创建query对象
Query query = session.createQuery("from Customer");
//2 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}
3.2HQL常用查询

hql条件查询语句写法:
(1)from 实体类名称 where 实体类属性名称=? and实体类属性名称=?
(2)from 实体类名称 where 实体类属性名称 like ?

//-----条件查询--------
//1 创建query对象
//SELECT * FROM t_customer WHERE cid=? AND custName=?
Query query = session.createQuery("from Customer c where c.cid=? and c.custName=?");
//2 设置条件值
// 向?里面设置值
// setParameter方法两个参数
// 第一个参数:int类型是?位置,?位置从0开始
// 第二个参数:具体参数值
//设置第一个?值
query.setParameter(0, 1);
//设置第二个?值
query.setParameter(1, "百度");

//3 调用方法得到结果
List<Customer> list = query.list();

for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}


//-------模糊查询------
//1 创建query对象
Query query = session.createQuery("from Customer c where c.custName like ?");

//2 设置?的值
// %浪%
query.setParameter(0, "%浪%");

//3 调用方法得到结果
List<Customer> list = query.list();

for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}


//-----排序查询--------
//1 创建query对象
Query query = session.createQuery("from Customer order by cid desc");

//2 调用方法得到结果
List<Customer> list = query.list();

for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}


//------分页查询------
//1 创建query对象
//写查询所有的语句
Query query = session.createQuery("from Customer");

//2 设置分页数据
//2.1 设置开始位置
query.setFirstResult(0);
//2.2 设置每页记录数
query.setMaxResults(3);

//3 调用方法得到结果
List<Customer> list = query.list();

for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}

//投影查询
//1.投影查询:查询不是所有字段值,而是部分字段的值
//2 投影查询hql语句写法:
//(1)select 实体类属性名称1, 实体类属性名称2  from 实体类名称
//(2)select 后面不能写 * ,不支持的
//1 创建query对象
Query query = session.createQuery("select custName from Customer");

//2 调用方法得到结果
List<Object> list = query.list();

for (Object object : list) {
	System.out.println(object);
}


//----聚集函数使用----
//常用函数count、sum、avg、max、min
//1 创建query对象
Query query = session.createQuery("select count(*) from Customer");

//2 调用方法得到结果
//query对象里面有方法,直接返回对象形式
Object obj = query.uniqueResult();

//返回int类型
//			int count = (int) obj;

//首先把object变成long类型,再变成int类型
Long lobj = (Long) obj;
int count = lobj.intValue();
System.out.println(count);

4.QBC查询

  1. 使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现
  2. 使用qbc时候,操作实体类和属性
  3. 使用qbc,使用Criteria对象实现
4.1QBC查询所有

(1)创建Criteria对象
(2)调用方法得到结果

//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 调用方法得到结果
List<Customer> list = criteria.list();
4.2QBC常用查询
//-----条件查询------
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);

//2 使用Criteria对象里面的方法设置条件值
// 首先使用add方法,表示设置条件值
// 在add方法里面使用类的方法实现条件设置
// 类似于 cid=?
//			criteria.add(Restrictions.eq("cid", 1));
//			criteria.add(Restrictions.eq("custName", "百度"));

criteria.add(Restrictions.like("custName", "%百%"));

//3 调用方法得到结果
List<Customer> list = criteria.list();


//-----排序查询-----
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);

//2 设置对哪个属性进行排序,设置排序规则 
criteria.addOrder(Order.desc("cid"));

//3 调用方法得到结果
List<Customer> list = criteria.list();


//-----分页查询-----
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 设置分页数据
//2.1 设置开始位置
criteria.setFirstResult(0);
//2.2 每页显示记录数
criteria.setMaxResults(3);
//3 调用方法得到结果
List<Customer> list = criteria.list();


//-----统计查询------
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 设置操作
criteria.setProjection(Projections.rowCount());
//3 调用方法得到结果
Object obj = criteria.uniqueResult();
Long lobj = (Long) obj;
int count = lobj.intValue();


//-----离线查询------
//1 servlet调用service,service调用dao
//(1)在dao里面对数据库crud操作
//(2)在dao里面使用hibernate框架,使用hibernate框架时候,调用session里面的方法实现功能
//1 创建对象
//Criteria criteria = session.createCriteria(Customer.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//2 最终执行时候才需要到session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = criteria.list();
原创文章 19 获赞 8 访问量 866

猜你喜欢

转载自blog.csdn.net/qq_41519304/article/details/105577336