1 查询所有 from Student list
2 分页查询 from Student setfirstresult begin记录索引从0开始 setmaxresults 设置每页显示多少行。 list
3 条件查询
A from Student where name=? setParameter(0,xxx) 索引从0开始 与jdbc的preparestement不同jdbc中从1开始。 list
B from Student where name=:name setParameter("name",xxx) list
如果能确定返回一条记录。 则可以不使用list 而使用uniqueResult
排序
分组
4查询指定列(投影查询)
1 在student类中给出Student(name)构造和无参数构造;
2 select new Student(name) from Student
3 list
5 命名查询
在hbm.xml中添加query
<query name="">
hql
</query>
session.getnamedquery(query的名字)
qbc
1 查询所有 createcriteria(Student.class) list
2 分页查询 createcriteria(Student.class) setfirstresult begin记录索引从0开始 setmaxresults 设置每页显示多少行。 list
3 条件查询
> createcriteria(Student.class) add(Restrictions.eq("name","zhangshan")) list
Restrictions.and(Restrictions.eq(),Restrictions.eq())
排序 criteria.addOrder(Order.desc("xxxx"));
分组 criteria.setProjection(Projections.projectlist().add(Projections.sum("money")).add(Projections.groupproperty("c")));
如果能确定返回一条记录。 则可以不使用list 而使用uniqueResult
4 离线查询
在action中创建detachedcriteria
detachedcriteria dc = DetachedCriteria.forclass(Student.class);
//添加条件
在dao中动态获取
Criteria c = dc.getExecutableCriteria(session)
对象导航
本地sql
createsqlquery(String sql) addEntity(Student.class)
十 多表查询及hibernate优化
1 sql中多表查询复习
2 hql中多表查询
迫切内连接 select distinct c from Customer c inner join fetch c.orders where xx
迫切左外连接 select distinct c from Customer c left join fetch c.orders where xx
迫切连接查询的出的是已经封装好的对象 , 同时如果查询的是一方数据需要注意去重。
3 事务的复习
4 hibernate中通过getcurrentsession来保证session是同一个对象,用于事务操作。底层通过threadlocal来实现。
5 hibernate优化
一级缓存优化
批量操作时,手动清除缓存
查询策略(用默认的就行,默认都是延迟加载和单表查询)
A 类级别上的
@Proxy(lazy=false/true) 默认是true即延迟加载 比如load 延迟加载返回的是一个cglib生成的代理对象,只有主键标识,其它数据都为null。
通过hibernate.initalize(xxx) 来初始化一个代理对象 在spring中通过OpenSessionInViewFilter来解决延迟加载问题
B 关联级别
查询到某个对象,获得其关联的对象或属性,这种称为关联级别检索。
在一方的set集合上配置
@fetch(select,subselect,join) 表示关联查询的sql语句形式。 默认是select
@lazycollection(true,false,extra) extra表示及其懒惰 默认是true
在多方的一方对象引用上配置
@fetch(select,join) 默认select
@lazytoone(false,proxy ) proxy 默认值 是否采用延迟,需要另一方的类级别延迟策略来决定
n+1问题