10.3 hibernate_查询方式(QBC查询、本地SQL查询)

QBC检索

  • QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口
HQL所能做的事情,使用QBC也大多能做用,这个通过实例来看看QBC是如何使用的。  
步骤:
  1. 获得session
  2. 创建criteria对象:session.createCriteria(Obejct.class); 
  3. 添加查询条件:使用criteria的API方法进行条件的增加。add(Restrictions.eq(属性名,值))
  4. 执行查询
list():返回一个集合列表,有可能集合中装的是数组,有可能是POJO对象。

uniqueResult():返回一个查询结果,在已知查询结果只有一个或者0个时,使用是没有问题的,如果返回结果有多个,那么就会报异常

1.普通使用

@Test
public void testQBC(){
	//1.创建一个Criteria对象
	Criteria criteria=session.createCriteria(Employee.clss);

	//2.添加查询条件:在QBC中查询条件使用Criterion来表示
	//Criterion可以通过Restrictions 的静态方法得到
	//Restrictions.eq相当于等于,Restrictions.gt相当于大于。
	criteria.add(Restrictions.eq("email","1234@qq.com"));
	criteria.add(Restrictions.gt("salary",5000F))'

	//3.查询
	Employee employee=(Employee) criteria.uniqueResult();
	System.out.println(employee);

2.and和or怎么作为查询条件

@Test
public void testQBC2(){
	Criteria criteria=session.createCriteria(Employee.class);
		
	//1.AND:使用Conjunction表示
	//Conjunction本身就是一个Criterion对象
	//且其中还可以添加Criterion对象
	Conjunction conjunction=Restricions.conjunction();
	conjunction.add(Restriction.like("name","a",MatchMode.ANYWHERE));
	Department dept=new Department();
	dept.setId(80);
	conjunction.add(Restriction.eq("dept",dept));
	System.out.prinln(conjunction);		//打印结果:(name like %a% and dept=Department [id=80])

	//2.OR
	Disjunction disjunction=Restriction.disjunction();
	disjunction.add(Restriction.ge("salary",6000F));
	disjunction.add(Restriction.isNull("email"));
	
	//添加查询条件
	criteria.add(disjunction);
	criteria.add(conjunction);
	
	criteria.list();	//打印结果为: ......where ( this_.SALARY>=? or this_.EMAIL is null) and (this_.NAME like ? and this_.DEPT_ID=?)
}
3.统计查询

@Test
public void testQBC3(){
	Criteria criteria=session.createCriteria(Employee.clss);
		
	//统计查询:使用Projection来表示:可以由Projections的静态方法得到
	criteria.setProjection(Projections.max("salart"));
		
	System.out.println(criteria.uniqueResult());
}
4.排序,分页查询
@Test
public void testQBC4(){
	Criteria criteria=session.createCriteria(Employee.clss);

	//1.添加排序
	criteria.addOrder(Order.asc("salary"));
	criteria.addOrder(Order.desc("email"));
	
	//2.添加分页方法
	int pageSize=5;
	int pageNo=3;
	
	List() list=ceriteria.setFirstResult((pageNo-1)* pageSize).setMaxResults(pageSize).list();
		
	System.out.println(list);
}

给一张表来看看qbc增加的条件查询语句。

                


本地SQL检索

  • 使用标准的SQL语句来编写
步骤:
  1. 获得session
  2. 编写sql语句
  3. 获取SQLQuey对象:session.createSQLQuery(sql);
  4. 给sql语句设置参数。
  5. 执行查询
list():返回一个集合列表,集合中装的是Object[]。
返回实体类对象集合,如果与实体类进行了绑定,也就是使用了addEntity(xxx.class)。

1.SQLHelloWorld

@Test
public void testNationSQL(){
	//2..编写sql语句
	Stirng sql= "INSERT INTO GG_department VALUES(?,?)";	//为GG_department表插入一条记录
	
	//3.获取SQLQuery对象
	Query query =session.createSQLQuery(sql);
	
	//4.给sql语句设置参数
	query.setInteger(0,280)
	     .setString(1,"ATGUIGU")
	     .excuteUpdate();		//执行sql
	
}

2.SQLUpdate

@Test
public void testNationSQL(){
	//编写SQL(删除id为37的这条记录),获取SQLQuery
	Query query =session.createSQLQuery(DETETE FROM Department d WHERE d.id= :id");
	
	//为sql设置参数
	query.setInteger("id",37).executeUpdate();
		
}
3.查询Staff的所有记录,并且绑定实体。 addEntity。
//使用的就是数据库表名了。
        SQLQuery SQLquery = session.createSQLQuery("select * from staff");
        //返回的是一个List<Object[]> 只有通过addEntity。来绑定实体。
        List<Staff> list = SQLquery.addEntity(Staff.class).list();
        System.out.println(list.get(0).getName());

//结果
Hibernate: 
    select
        * 
    from
        staff
qqq1

可参考:http://www.cnblogs.com/whgk/p/6159336.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值