Hibernate基础(4)

来源:互联网 发布:linux卸载oracle11g 编辑:程序博客网 时间:2024/06/07 23:53
一、Hibernate查询
1. 对象导航查询
(1)根据ID查询某个客户,再查询这个客户里面所有的联系人
(2)代码:
Customer customer = Session.get(Customer.class,1)
Set<LinkMan> linkMan = customer.getSetLinkMan()

2. OID查询
(1)根据ID查询某一个记录,返回对象
(2)代码:
Customer customer = Session.get(Customer.class,1)

3. HQL查询
(1)Query对象,写HQL语句实现查询
(2)查询所有:
查询所有客户:
代码:
Query query = session.createQuery("From Customer")
List<Customer> list = query.list()

(3)条件查询:
HQL条件查询语句的写法:
(1) from 实体类名称 where 实体类属性名称=?and ....
(2) from 实体类名称 where 实体类属性名称 like ?
代码:
Query query = session.createQuery("from Customer c where c.cid=? and c.custName=?")
query.setParameter(0,1)
query.setParameter(1,"")
List<Customer> custs = query.list()
(4)排序查询:
HQL条件查询语句的写法:
(1) from 实体类名称 order by 实体类属性名称 ASC/DESC
代码:
Query query = session.createQuery("from Customer Order By cid")
List<Customer> custs = query.list()
(5)分页查询:
Mysql实现分页的方式:limit
HQL中实现分页,不能使用limit,使用Hibernate的Query对象的方法实现分页操作
代码:
Query query = session.createQuery("from Customer")
query.setFirstResult(0) // 设置开始位置(计算公式:(当前页 -1) * 每页记录数)
query.setMaxResult(3) // 设置每页记录数
List<Customer> custs = query.list()

(6)投影查询:
查询部分字段的值
HQL投影查询语句的写法:
Select 实体类属性1,实体类属性2 from 实体类名称
代码:
Query query = session.createQuery("select custName from Customer")
List<Customer> custs = query.list()
(7)聚集函数查询:
常用的聚集函数:count、sum、avg、max、min
HQL投影查询语句的写法:
Select count(*) from 实体类名称
代码:
Query query = session.createQuery("select count(*) from Customer")
Object obj = query.uniqueResult()// 返回值先转换成Long,再转换成Int
4. QBC查询
(1)Criteria对象,不需要写HQL语句,使用方法实现
(2)查询所有:
查询所有客户:
代码:
Criteria criteria = session.createCriteria(Customer.class)
criteria.add(Restrictions.eq("cid",1))
criteria.add(Restrictions.eq("custName",""))
criteria.list()
(3)条件查询:
代码:
Criteria criteria = session.createCriteria(Customer.class)
criteria.add()
criteria.list()

(4)排序查询:
代码:
Criteria criteria = session.createCriteria(Customer.class)
criteria.addOrder(Order.asc("cid"))
criteria.list()

(5)分页查询:
Mysql实现分页的方式:limit
HQL中实现分页,不能使用limit,使用Hibernate的Query对象的方法实现分页操作
代码:
Criteria criteria = session.createCriteria(Customer.class)
criteria.setFirstResult(0) // 设置开始位置
criteria.setMaxResult(3) // 设置每页记录数
criteria.list()

(6)统计查询:
代码:
Criteria criteria = session.createCriteria(Customer.class)
criteria.setProjection(Projections.rowCount())
criteria.uniqueResult()

(7)离线查询:
与session无关
代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class)
Criteria criteria = detachedCriteria.getExecutableCriteria(session)
criteria.list()

6.HQL多表查询
(1) 内连接(两个表有关联关系)
HQL语句的写法:
from Customer c inner join c.setLinkMan
代码:
Query query = session.createQuery("from Customer c inner join c.setLinkeMan")
query.list() // 每部分是数组

(2) 左外连接(左边表示所有,右边表示关联)
HQL语句的写法:
from Customer c left outer join c.setLinkMan
代码:
Query query = session.createQuery("from Customer c inner join c.setLinkeMan")
query.list() // 每部分是数组

(3) 右外连接(右边表示所有,左边表示关联)
HQL语句的写法:
from Customer c right outer join c.setLinkMan
代码:
Query query = session.createQuery("from Customer c inner join c.setLinkeMan")
query.list() // 每部分是数组

(4) 迫切内连接
与内连接底层实现一样,区别是:迫切内连接返回list每部分是对象
HQL语句的写法:
from Customer c inner join fetch c.setLinkMan
代码:
Query query = session.createQuery("from Customer c inner join c.setLinkeMan")
query.list() // 每部分是对象

(5) 迫切左外连接
HQL语句的写法:
from Customer c left outer join fetch c.setLinkMan
代码:
Query query = session.createQuery("from Customer c inner join c.setLinkeMan")
query.list() // 每部分是对象

5. HIbernate检索策略
(1)分类
(1)立即查询
根据ID查询,调用get方法,一般调用get方法立即发送语句查询数据库
(2)延迟查询
根据ID查询,调用load方法,一般调用load方法不会立即发送语句查询数据库,只有得到对象里的值时才会查询数据库
(2)延迟查询分类:
(1)类级别
根据ID查询返回实体类对象,调用Load方法不会马上发送语句
(2)关联级别
在配置文件中进行配置:
fetch : Select(默认)
lazy:
true:延迟
false:不延迟
extra:极其延迟

5. 批量抓取
<Set batch-size="整数即可,越大越好"> 减少语句查询次数




原创粉丝点击