HbernateFourCourse

hibernate查询升级(举例:一个Customer对应多个LinkMan)

1.hql查询

Query query=session.createQuery(hql);  //获得查询对象

List list=query.list();  //查询 结果为list         query.uniqueResult();  //查询结果为对象

设置分页:query.setFirstResult();          query.setMaxResults();

设置聚合函数:String hql=“select count(*)  from 类的完整包名”       count 计数,sum 求和,avg平均数,max,min

投影查询:只查询对象的某一个属性 例:“select cust_id  from 完整包名  where 条件”

如果查询多个属性还可以这样写”select   new  Customer(cust_id,cust_name)    from  完整包名  where  条件”

2.Criteria //完全面向对象操作数据库

Criterial c=session.createCriterial(类.class);  //获得查询对象

c.add(Restrications.eq(“cust_id”,1l));   //添加查询id条件

c.list();    c.uniqueResult();          //执行查询

 

添加排序条件: c.addOrder(Order.asc(“String propertyname”));

添加聚合条件:c.setProjection(Projections.rowCount());

3.离线Criteria

离线criterial使操作更加灵活,在线的criteria创建必须要经过session创建,这样使查询条件在dao层固定了,若使用离线的

criteria就可以先创建条件,离线的可以放在dao层以外的地方,执行criteria在dao层就可以固定了,就使dao层可以解放了

DetachedCriteria ds=DetachedCriteria.forclass(对应实体类.class);  //创建离线criteria

ds.add(Restrions.idEq());           //为离线criteria添加查询条件

Criteral criteral=ds.gerExcutableCriteria(session);   //创建在线的crteria,可以放在dao层

criteria.list(); //执行在线的criteria

4.类级别查询(延迟加载|懒加载)  为提高服务器效率,建议使用延迟加载(正对单个类)

根据id查;

Customer c=session.load(Customer.class,2l);        当使用到customer对象时才去数据库查询,load默认lazy为true

设置延迟加载  在对应类的hbm.xml文件 <class  lazy=”true”>中设置

当使用到customer属性时,系统会根据关联的session去查询数据库,如果关联的session关闭了就会报错

session中其它方法不存在延迟加载

5.集合属性策略(集合级别的关联,针对集合)

设置延迟加载  在对应类的hbm.xml文件 <set  fetch=“”  lazy=”true”>中设置

lazy属性值:true 、false 、extra(及其懒惰,如果只查询集合的size,就只查询count,查询其他的都要查出所有)

fetch属性值(加载策略):默认select (单表查询加载) 、join(多表查询加载集合) 、subselect(使用子查询加载集合)

 

当fetch为join时,lazy失效,会在加载主表时一口气查出从表的数据,customer left join  linkman

当fetch为subselect时,子查询时用到 语句  in          一个查询语句结果作为另一个查询条件

6.熟悉关联(关联的是一个对象,一堆多的多)

<many-to-one   lazy=”false/proxy”   fetch=”select/join”>       都是只有两种选择条件

proxy:加载策略由Customer对应<class    lazy>,如果Custom为懒,他就懒,默认prox

 

总结:为了提高效率,fetch应选择select,lazy应选择true,全部使用默认值。

7.no -session问题

对象通过懒加载得到对象,在sevice层开启session,也关闭session,此时对象就为空了,当在页面和web层用到对象时,就会报错。

 

这时候就需要扩大session的作用范围,这时侯就要用到Filter

chain.doFilter();之前可以前处理,之后得到jsp后继续执行chain.doFilter()之后的代码;

所以解决session问题就在chain.doFilter()后关闭事务;

8.batch-size

一次抓取的集合,设置在customer.hbm.xml中<set  batch-size>,一次抓取3个联系人

可以提高效率

 

 

时间: 2018年09月18日下午16:42  |  
作者:
LEAVE A REPLY

loading