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

深藏阁楼爱情的钟 2022-06-01 05:23 337阅读 0赞

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.普通使用

  1. @Test
  2. public void testQBC(){
  3. //1.创建一个Criteria对象
  4. Criteria criteria=session.createCriteria(Employee.clss);
  5. //2.添加查询条件:在QBC中查询条件使用Criterion来表示
  6. //Criterion可以通过Restrictions 的静态方法得到
  7. //Restrictions.eq相当于等于,Restrictions.gt相当于大于。
  8. criteria.add(Restrictions.eq("email","1234@qq.com"));
  9. criteria.add(Restrictions.gt("salary",5000F))'
  10. //3.查询
  11. Employee employee=(Employee) criteria.uniqueResult();
  12. System.out.println(employee);

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

  1. @Test
  2. public void testQBC2(){
  3. Criteria criteria=session.createCriteria(Employee.class);
  4. //1.AND:使用Conjunction表示
  5. //Conjunction本身就是一个Criterion对象
  6. //且其中还可以添加Criterion对象
  7. Conjunction conjunction=Restricions.conjunction();
  8. conjunction.add(Restriction.like("name","a",MatchMode.ANYWHERE));
  9. Department dept=new Department();
  10. dept.setId(80);
  11. conjunction.add(Restriction.eq("dept",dept));
  12. System.out.prinln(conjunction); //打印结果:(name like %a% and dept=Department [id=80])
  13. //2.OR
  14. Disjunction disjunction=Restriction.disjunction();
  15. disjunction.add(Restriction.ge("salary",6000F));
  16. disjunction.add(Restriction.isNull("email"));
  17. //添加查询条件
  18. criteria.add(disjunction);
  19. criteria.add(conjunction);
  20. criteria.list(); //打印结果为: ......where ( this_.SALARY>=? or this_.EMAIL is null) and (this_.NAME like ? and this_.DEPT_ID=?)
  21. }

3.统计查询

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

4.排序,分页查询

  1. @Test
  2. public void testQBC4(){
  3. Criteria criteria=session.createCriteria(Employee.clss);
  4. //1.添加排序
  5. criteria.addOrder(Order.asc("salary"));
  6. criteria.addOrder(Order.desc("email"));
  7. //2.添加分页方法
  8. int pageSize=5;
  9. int pageNo=3;
  10. List() list=ceriteria.setFirstResult((pageNo-1)* pageSize).setMaxResults(pageSize).list();
  11. System.out.println(list);
  12. }

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

                874710-20161211212907866-1504180705.png

本地SQL检索

  • 使用标准的SQL语句来编写

步骤:

  1. 获得session
  2. 编写sql语句
  3. 获取SQLQuey对象:session.createSQLQuery(sql);
  4. 给sql语句设置参数。
  5. 执行查询

list():返回一个集合列表,集合中装的是Object[]。
返回实体类对象集合,如果与实体类进行了绑定,也就是使用了addEntity(xxx.class)。

1.SQLHelloWorld

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

2.SQLUpdate

  1. @Test
  2. public void testNationSQL(){
  3. //编写SQL(删除id为37的这条记录),获取SQLQuery
  4. Query query =session.createSQLQuery(DETETE FROM Department d WHERE d.id= :id");
  5. //为sql设置参数
  6. query.setInteger("id",37).executeUpdate();
  7. }

3.查询Staff的所有记录,并且绑定实体。 addEntity。

  1. //使用的就是数据库表名了。
  2. SQLQuery SQLquery = session.createSQLQuery("select * from staff");
  3. //返回的是一个List<Object[]> 只有通过addEntity。来绑定实体。
  4. List<Staff> list = SQLquery.addEntity(Staff.class).list();
  5. System.out.println(list.get(0).getName());
  6. //结果
  7. Hibernate:
  8. select
  9. *
  10. from
  11. staff
  12. qqq1

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

发表评论

表情:
评论列表 (有 0 条评论,337人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hibernateQBC查询

    最近不得不写一下,就因为一个简单的查询的功能,让没用过hibernate的QBC查询的我卡了三天,原因是没有用过,我在网上查了好多资料, 关于QBC查询的介绍、问题、少的可怜,