Hibernate学习笔记(4)

nibiru 2019年05月03日 55次浏览

前言

今天来学习一下Hibernate框架的检索方式,这样对Hibernate框架的学习基本上已经结束了。

Hibernate查询方式

对象导航查询

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

OID查询

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

HQL查询

利用Query对象,写hql语句实现

QBC查询

利用Criteria对象里面的方法

sql查询

利用SQLQuery对象,写sql语句实现查询

对象导航查询

根据已经加载的对象,导航到他的关联对象,利用类与类之间的关系来检索对象

//根据cust_id=1,来查询这个客户里面的联系人
            Customer customer=session.get(Customer.class,1);
            //查询这个客户里面的所有联系人,直接得到客户里面联系人的set集合
            Set<Linkman> linkman= customer.getLinkMans();

OID检索方式

OID检索方式利用Session的get和load方法加载某条记录对应的对象

Customer customer=session.get(Customer.class,1);

HQL检索

HQL(Hibernate Query Language)是面向对象的查询语言,这个在第二天的时候有提到过,他与SQL语言有些类似,SQL语言是操作数据库和表,HQL是操作类、对象和属性

查询所有

创建Query对象,写hql语句,调用query对象里面的方法得到结果


查询所有:from 实体类名称

//创建query对象,调用方法得到结果,遍历输出
Query query=session.createQuery("from Customer ");
            List<Customer> list=query.list();
            for(Customer customer:list)
            {
                System.out.println(customer.getCust_id()+customer.getCust_name());
            }
            

条件查询

from 实体类名称 where 实体类属性名称=? and实体类属性名称=?

Query query=session.createQuery("from Customer c where c.cust_id=? 0 and c.cust_name=? 1");
//向?里面设置值,setParemeter里面需要两个参数
//第一个参数:int类型是?位置,位置从0开始
//第二个参数:具体的参数值
            query.setParameter(0,1);
            query.setParameter(1,"小溪");
            List<Customer> list=query.list();

注意:新版本的Hibernate,?占位符后面要加上相应的数字,如果不加数字会报错

模糊查询

from 实体类名称 where 实体类属性名称 like ?

Query query=session.createQuery("from Customer c where c.cust_name like ? 0");
//设置?的值
query.setParameter(0,"%溪%");

排序查询

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


asc升序
desc降序

Query query=session.createQuery("from Customer order by cust_id desc");

分页查询

在mysql中,我们使用limit关键字来实现分页


在hql中实现分页,我们则需要使用query封装的两个方法来实现

Query query=session.createQuery("from Customer ");
//设置开始的位置
            query.setFirstResult(0);
            //设置每页的记录数
            query.setMaxResults(3);
            //调用方法来得到结果
            List<Customer> list=query.list();

投影查询

1 投影查询:查询不是所有字段值,而是部分字段的值

2 投影查询hql语句写法:

(1)select 实体类属性名称1, 实体类属性名称2 from 实体类名称

(2)select 后面不能写 * ,不支持的

Query query=session.createQuery("select cust_name from Customer ");
            List<Object> list=query.list();
            for(Object object:list)
            {
                System.out.println(object);
            }

聚集函数的使用

1 常用的聚集函数
(1)count、sum、avg、max、min


2 hql聚集函数语句写法


(1)查询表记录数
select count(*) from 实体类名称

Query query=session.createQuery("select count(*) from Customer ");

QBC检索

QBC(Query By Criteria)不需要写语句,利用内置方法来完成查询操作

//创建Criteria对象
            Criteria criteria =session.createCriteria(Customer.class);
            //设定查询条件,查询 cust_id为1的数据
            Criterion criterion= Restrictions.eq("cust_id",1);
            //添加查询条件
            criteria.add(criterion);
            List<Customer> list=criteria.list();
            for(Customer customer:list)
            {
                System.out.println(customer);
            }

常用方法:
hibernate4-2

基本检索

//简单查询
Criteria criteria =session.createCriteria(Customer.class);
List<Customer> list=criteria.list();
            for(Customer customer:list)
            {
                System.out.println(customer);
            }

条件检索

Criteria criteria =session.createCriteria(Customer.class);
//设置条件
 criteria.add(Restrictions.eq("cust_name","小溪"));
 criteria.add(Restrictions.like("cust_name","%溪%"));
 criteria.add(Restrictions.gt("cust_id",3));

分页检索

Criteria criteria =session.createCriteria(Customer.class);
criteria.setFirstResult(1);
criteria.setMaxResults(3)

排序检索

hibernate4-3

criteria.addOrder(Order.desc("cust_id"));

统计检索

criteria.setProjection(Projections.rowCount());
Long count =(Long) criteria.uniqueResult();
System.out.println(count);

离线查询

理解:假如我们有一个商品表,里面包含了热门商品,我们需要查询出热门商品显示在首页上面,但是热门商品的信息随时都在变动,所以我们不可能自己编写查询语句不停的去查询数据库,这时我们就可以使用离线查询。

DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Customer.class);
Criteria criteria=detachedCriteria.getExecutableCriteria(session);
 List<Customer> list=criteria.list();

Hibernate抓取策略

什么是抓取策略?

Hibernate抓取策略是指当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。

延迟加载

延迟加载是为了提升性能,避免一些无谓的性能开销,所谓延迟加载,就是当真正需要数据的时候,才真正的执行数据加载的操作。


延迟加载通常分为两类,一类叫做类级别延迟,另一类叫做关联级别的延迟,类级别的延迟指的是查询某个对象的时候,是否采用有延迟,这个通常在< class >标签上配置lazy属性。关联级别延迟指的是,查询一个对象的关联对象的时候是否采用延迟加载,这个通常在< set >或< many-to-one >上配置lazy属性。

类级别的延迟加载

使用load方法检索某个对象的时候,这个类是否采用延迟加载策略,就是类级别的延迟。这个通常在< class >标签上配置lazy属性,lazy的默认值是true,默认是延迟加载的,所以使用load方法去查询的时候,不会马上发送sql语句,当真正使用的时候才会发送sdl语句

Customer customer =session.load(Customer.class);

关联级别的延迟加载

Customer customer=session.get(Customer.class,1);
Set<Linkman> linkmans=customer.getLinkMans();

通过客户查询其关联的联系人对象,在查询联系人的时候是否采用延迟加载称为关联级别的延迟,无关联级别的延迟通常是在< set >和< many-to-one >上来进行配置
hibernate4-4

抓取策略

hibernate4-5

总结

至此,Hibernate的框架的学习告一段落。总的来说,Hibernate框架的学习还是挺简单的,当然还有一些我没有深入下去研究,这也要以后的开发项目中慢慢来学习了。