Hibernate学习笔记④

Hibernate查询

(1)对象导航查询

【简单】

【业务需求实例】查询某个客户公司的所有联系人

【实现思路】使用session.get获取客户对象,在用获取的对象调用getSet获取所有属于该公司的联系人即可

(2)OID查询【根据id查询就是oid查询】

(3)HQL查询

【重要】【常用】

【常用的HQL语句】

  1. 查询所有         【from 实体类名称】
  2. 条件查询         【from 实体类名称 [实体类别名] where [实体类别名.]实体类属性名称=?and [实体类别名.]实体类属性名称=?】【模糊查询 直接加like就行了】
    Query query = session.createQuery("from Client where cName = ?");
    query.setParameter(0, "baidu");  //问号的位置是从0开始的,使用setParameter()方法

    //模糊查询
    //假设数据库中有一条 新浪 的数据
    Query query = session.createQuery("from Client where cName like ?");
    query.setParamter(0,"%浪%");
  3. 排序查询         【from 实体类名称 order by 实体类属性名称 desc/asc】
  4. 分页查询         Hibernate封装了两个方法用来实现分页
    //设置分页数据
    //设置开始位置
    query.setFirstResult(0);
    //设置每一页的数目
    query.setMaxResults(2);
  5. 投影查询       【什么是投影查询   查询部分字段的值而不是所有的值】【from 实体类属性名 from 实体类名称】
  6. 聚集函数使用 【常用聚集函数 count max min sum avg】
Query query = session.createQuery("select count(*) from Client");
            //返回一个对象而不是list
            Object obj = query.uniqueResult();
            //将Object转换成int形
            //obj返回的是long类型,首先需要将Object变成Long类型
            Long longObj = (Long)obj;
            int i = longObj.intValue();

/*也可以在使用uniqueResult的时候直接声明为Long类型,在转换即可*/

 

 

(4)QBC查询【很多人常用??】

QBC不需要使用HQL,使用方法查询。

使用Criteria对象实现

查询

Criteria criteria = session.createCriteria(Client.class);

 条件查询

Criteria criteria = session.createCriteria(Client.class)
criteria.add(Restrictions.eqProperty(propertyName, otherPropertyName));

 模糊查询

Criteria criteria = session.createCriteria(Client.class);
criteria.add(Restrictions.like(propertyName, value,));

 Restrictions类是QBC查询中很重要的一个类,里面有很多static方法,大多是设置条件

 

 

 

 

 

 

此外还有

排序

criteria.addOrer(Order.asc(propertyName))

Order.asc --> 根据传入的字段进行升序排序

Order.desc --> 根据传入的字段进行降序排序

分页查询

调用方法与HQL一样

分页起始页计算公式:(当前页-1)*每一页的记录数

Order.desc --> 根据传入的字段进行降序排序

Hibernate多表查询

多表查询有:

  • 内连接    【查询显示出和两个表都有关系的条目】

                      select * from t_table1 t1,t_table2 t2 where t1.cid = t2.uid   或者 select * from t_table1 t1 INNER JOIN t_table2 t2 ON t1.cid = t2.uid

  • 左外链接  【查询出左表的全部和右表中和左表有关系的条目】

                      select * from t_table1 t1  LEFT OUTER JOIN t_table2 t2 ON t1.cid = t2.uid

  • 右外链接 【与左链接相反 查询出右表的全部和左表中和右表有关系的条目】

HQL实现多表查询

HQL实现多表查询有下面几种类型:内连接 左外 右外  迫切内连接 迫切左外链接

(1)内连接

只需要记住内连接HQL查询语句

from Client c inner join c.belongContacter【表示类内表示多的Set集合的属性名】

 

Query query = session.createQuery("from Client c inner join c.belongContecter");
//使用内连接查询返回的List中返回的每个元素是数组的形式
List joinList = query.list();

 

(2)迫切内连接

【HQL】 from Client c inner join fetch c.belongContacter

【与内连接区别】 内连接返回的List是数组 而迫切内连接返回的List中的每个元素是对象的形式

(3)左外连接

【HQL】 from Client c left outer join c.belongContacter

(4)迫切左外链接

【HQL】 from Client c left outer join fetch c.belongContacter

(5)右外连接

【HQL】 from Client c right outer join c.belongContacter

 

Hibernate检索策略

【Hibernate检索策略分类】分为立即查询和延迟查询

【立即查询】如果根据id查询 马上发送请求查询数据库

【延迟查询】不会马上查询数据库 使用load()方法进行延迟查询 只有得到对象里面的值的时候才会发送语句进行查询

Client client = session.load(Client.class, 1);

 此时的client对象里面只有一个id值为1,当我们试图获取client的更多属性比如获取用户的名称,client.getClientName,此时Hibernate才会发送SQL请求查询返回查询结果。

【延迟查询分类】 分为类级别延迟和关联级别延迟

【类级别延迟】 load方法就是类级别延迟,查询的对象是某个实体类

【关联级别延迟】 查询实体类的关联实体类的过程的延迟,在实体类的配置文件的set标签中进行配置【一般不用修改】

lazy=extra  【及其懒惰】 要什么值给你查询什么值

【批量抓取】

【使用场景】需要获取所有客户的所有联系人

【使用方法】设置配置文件中的<set>标签的batch-size属性 只要给个整数就可以了  这个值越大效率越高

 

 

 

 

 

posted @ 2017-03-15 18:54  Youngs的学习之路  阅读(127)  评论(0编辑  收藏  举报