hibernate-04HQL|Criteria|查询优化

hibernate的查询分类:oid查询-get、对象属性导航查询、HQL、Criteria、原生SQL

 

1.HQL语法

基础语法

String hql = " from Customer "; 
Query query = session.createQuery(hql);
List<Customer> list = query.list();

排序

String hql = " from  Customer order by cust_id asc ";
Query query = session.createQuery(hql);
List list = query.list();

条件

String hql = " from  Customer where cust_id = ? ";
Query query = session.createQuery(hql);
query.setParameter(0, 2l);
List list = query.list();

分页

String hql = " from  Customer  ";
Query query = session.createQuery(hql);		
query.setFirstResult(0);//(当前页数-1)*每页条数
query.setMaxResults(2);
List list = query.list();

聚合

count、sum 、avg 、max、min

String hql = " select count(*) from  Customer  ";
Query query = session.createQuery(hql);	
Number number  = (Number) query.uniqueResult();

投影:查询部分列

String hql = " select cust_name from  Customer  ";
Query query = session.createQuery(hql);
List list = query.list();

多表查询

内连接(迫切)、外连接:左外(迫切)、右外(迫切)

//普通内连接:将连接的两端对象分别返回.放到数组中.
String hql = " from Customer c inner join c.linkMens ";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object[] arr : list){
	    System.out.println(Arrays.toString(arr));
}
//迫切内链接fetch:帮我们进行封装.返回值就是一个对象
String hql = " from Customer c inner join fetch c.linkMens ";	
Query query = session.createQuery(hql);
List<Customer> list = query.list();

 

 

2.Criteria语法

基本

Criteria c = session.createCriteria(Customer.class);
List<Customer> list = c.list();

条件:Restrictions

Criteria c = session.createCriteria(Customer.class);
c.add(Restrictions.eq("cust_id",2l));
List<Customer> list = c.list();

分页

Criteria c = session.createCriteria(Customer.class);
c.setFirstResult(0);
c.setMaxResults(2);
List<Customer> list = c.list();

排序:Order

Criteria c = session.createCriteria(Customer.class);
c.addOrder(Order.asc("cust_id"));
List<Customer> list = c.list();

统计:Projections

Criteria c = session.createCriteria(Customer.class);
c.setProjection(Projections.rowCount());
Long cont = (Long) c.uniqueResult();

离线查询:DetachedCriteria 

web层提前封装好一个离线的Criteria,例:在dao层封装一个条件查询,而web层则设置具体什么条件(根据id、name、age...)

//web层或service层
DetachedCriteria dc  = DetachedCriteria.forClass(Customer.class);
dc.add(Restrictions.idEq(6l));//拼装条件(全部与普通Criteria一致)

//dao层
Criteria c = dc.getExecutableCriteria(session);	//传过来的dc
List list = c.list();

 

 

3.查询优化

1>类级别查询(一次性加载和懒加载):单表时

session.get方法:没有任何策略.调用即立即查询数据库加载数据

Customer c = session.get(Customer.class, 2l);

session.load方法:应用类级别加载策略(懒加载),是在执行时,不发送任何sql语句.返回一个对象.使用该对象时,才执行查询.

Customer c = session.load(Customer.class, 2l);
//orm元数据中lazy:true懒加载|false非懒加载(不懒时与get无区别)
<class name="Customer" table="cst_customer" lazy="false" >

 

2>关联级别查询:关联多表时

在orm元数据中多表关系表达的set标签中使用:可搭配出九种情况

结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.

 

3>no-session问题解决:懒加载是通过代理对象来实现的,即:使用时才调用,要求必须使用同一个session。在session.close()后会出现此问题,解决办法:扩大session的作用范围(在filter中配置)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值