4、Hibernate 各种查询操作 总结

Hibernate查询操作


一.对象导航查询

1.根据id查询某个客户,再想查询这个客户里的所有联系人

2.代码

Customer customer = session.get(Cusertomer.class . 1);
Set<LinkMan> linkman = customer.getSetLinkMan();

二.OLD查询

1.根据id查询某一条记录,返回对象

(1)session中的get方法


三.HQL查询

1.Query对象,写hql语句查询

2.常用hql

(1)查询所有

  • from 实体类名称
//查询所有客户
//1.创建Query对象,写hql语句  2.调用query对象里面的方法得到结果
Query query = session.createQuery("from Customer");
List<Customer> list= query.list();
for(Customer c : list){
		sout(c);
}

(2)条件查询

  • from 实体类名称 where 实体类属性名称= ? AND 实体类属性名称= ?
  • 设置值时 使用 setParameter(int arg0 , Object arg1)方法 参数位置是从0开始
  • 若是使用模糊查询 设置参数是写 “%小%” 即可
//查询所有客户
//1.创建Query对象
Query query = session.createQuery("from Customer c where  c.cid = ? and  c.cname = ?");
//2.设置条件值
//第一个参数 int类型是?位置  ,从0开始计数
//第二个参数 具体的值
query.setParameter(0, 1);
query.setParameter(1, "百度")//3得到结果
List<Customer> list= query.list();
for(Customer c : list){
		sout(c);
}

(3)排序查询

  • from 实体类名称 order by 实体类属性名称 asc/desc

(4)分页查询

Query query = session.createQuery("from Customer");
//设置分页开始位置
query.setFirstResult(0);
//设置每页记录数
query.setMaxResults(3);
//调用方法获取结果
List<Customer> list= query.list();
for(Customer c : list){
		sout(c);
}

(5)投影查询

  • 查询部分字段的值 select cid from t_customer
  • select 实体类属性名称1 , 实体类属性名称2 from 实体类名称
  • select 后面是不可以写 * ,不支持

(6)聚集函数查询使用

  • 常用聚合函数 count sum avg max min
  • 查询表的记录数 select count(*) from 实体类名称
Query query = session.createQuery("select count(*) from Customer");
//获取结果
Object obj = query.uniqueResult();
//类型转换
Long lobj = (Long)obj;
int count = lobj.intValue();
sout(count )

3.使用hql查询操作时,使用Query对象

(1)创建Query对象,写hql语句

(2)调用query对象里面的方法得到结果

四.QBC查询

1.使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现

2.使用qbc ,操作实体类和属性

3.使用qbc ,使用Criteria对象实现

4.各种方法实用:

(1)查询所有

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2调用方法得到结果
List<Customer>  list = criteria.list();
//输出
sout(count )

(2)条件查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2使用add方法,添加条件值
criteria.add(Restricitions.eq("cid",1));
criteria.add(Restricitions.eq("customer","百度"));
//输出
List<Customer>  list = criteria.list();

在这里插入图片描述

(2)条件查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2使用add方法,添加条件值
criteria.add(Restricitions.eq("cid",1));
criteria.add(Restricitions.eq("customer","百度"));
//输出
List<Customer>  list = criteria.list();

(3)排序查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2使用addOrder方法中的Order.desc("cid") ,添加条件值
criteria.addOrder(Order.desc("cid"));
//输出
List<Customer>  list = criteria.list();

(4)分页查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2设置开始位置
criteria.setFirstResults(0;
//2设置每页记录数
criteria.setMaxResults(3;
//输出
List<Customer>  list = criteria.list();

(5)统计查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2。设置操作
criteria.setProjection(Projections.rowCount())
//3.得到结果
Object obj = criteria。uniqueResult();
Long lobj = (Long)obj;
int count = lobj.intValue();
sout(count);

(6)离线查询

//1创建对象
//Criteria criteria = session.createCriteria(Custermoer.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Cutomer.class);
//2 
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Cutomer> list = criteria.list();



五.HQL多表查询

1.内连接

(1)内连接查询hql语句语法,以客户和联系人为例

  • from Customer c inner join c.setLinkMan
  • 返回list , list里面每部分是数组的形式

4.迫切内连接

(1)迫切内连接和内连接底层实现是一样的

(2)区别:使用内连接返回list中每部分是数组,而迫切内连接返回的是对象

  • from Customer c inner join fetch c.setLinkMan

2.左外连接

  • from Customer c left outer join c.setLinkMan
  • 返回list , list里面每部分是数组的形式

5.迫切左外连接

  • from Customer c left outer join fetch c.setLinkMan

3.右外连接


五.hiebernate 检索策略

1.检索策略的概念

2.hibernate 分为两类

(1)立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库

(2)延迟查询:根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库

3.hibernate 延迟查询 分为两类

(1)类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句

  • 即为 load方法实现

(2)关联级别延迟:

  • 想要查询某个客户,再想查询这个客户的所有联系人 ,,查询客户的所有联系人的过程是否需要延迟
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值