hibernate(十)HQL查询及Criteria条件查询

Hibernate查询接口Query、Criteria

Query

此接口执行的语言是HQL,HQL语言是hibernate自己定义的,是面向类查询的,它的语法是sql的语法,它操作的是类,是面向对象的语言。这个语言看上去很像sql,但不要被语法结构上的相似锁迷惑,HQL是非常有意识的被设计为完全面向对象的查询特点:面向类的查询语言及面向对象的查询语言,模仿SQL语法,支持大部分SQL查询使用规则。这样的语言使得开发人员写查询非常少,从而提高效率,养成面向对象的思想。

以学生班级作为例子验证HQL语言的一些特点:

对大小写敏感,但类名除外

书写测试查询的方法调用dao层的查询

public static void find(){
        Student student=(Student) BaseDao.getUser("from Student where id=1");
        System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName());
    }

查询结果发送了两条sql语句

这里写图片描述

更改查询将类名之外的改为大写运行后结果一致,但当把类名改为小写后报如下错误

from student where id=1

这里写图片描述

支持关联和连接查询

更改查询时传入的语句为
Student student=(Student) BaseDao.getUser("from Student as s left outer join fetch s.grade where s.id=1");
可以查出相同的内容。连接查询fetch获得抓取的意思必须写只发一条语句,是HQL语言的优化。3张表不关联发4条语句关联的话也不是只发一条。

支持where子句查询上面已经验证。

支持聚集函数查询在聚合查询时支持select

在调用查询方法时注意,查询出来的结果是几条,根据条数选择调用单条还是全查的方法。
以查询数据库中的学生表有几条记录。

public static void findAll(){
        Object obj=BaseDao.findAll("select count(*) from Student");
        System.out.println(obj);
    }

运行结果如下:
这里写图片描述

支持表达式查询

以in为例

public static void findAll(){   
    @SuppressWarnings("unchecked")
    List<Student> students=(List<Student>) BaseDao.findAll("from Student where id in(1,3)");
    for (Student student : students) {
        System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName());
    }       
    }

数据库中的内容如下:
这里写图片描述

查询结果与数据库中内容一致,发送的语句中包含了in。
这里写图片描述

分页查询

在dao层书写新方法,主要通过下面两个方法控制分页
setFirstResult()方法,从那一条记录开始
setMaxResults()方法每页中最多放几条记录。

    public static List<?> findWithPage(String HQL,int row,int page){
        Session session =HibernateUntil.getSession();
        List<User> list=null;
        try {
            list=session.createQuery(HQL).setFirstResult(row).setMaxResults(page).list();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            HibernateUntil.closeSession(session);
        }   
        return list;    
    }

测试方法

    public static void findWithPage(){
        List<Student> students=(List<Student>) BaseDao.findWithPage("from Student",0,2);
        for (Student student : students) {
            System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName());
        }
    }

运行结果可以看到里面出现了limit关键字。

这里写图片描述

Criteria

Criteria接口表示特定持久类的一个查询,运用的是反射机制,指的是纯粹面向对象查询,连sql的影子都看不到。该接口是通过session中的createCriteria()方法获得。

测试运用Criteria接口进行的查询,这样的查询不成熟.

在dao层新建查询方法

    public static List<?> findAllCriteria(Class<?> c){
        Session session =HibernateUntil.getSession();
        List<User> list=null;
        try {
            list=session.createCriteria(c).list();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            HibernateUntil.closeSession(session);
        }   
        return list;        
    }

测试全查,查询过程中发送的语句默认用左外连接查询,想改成其他的不行

    public static void findCir(){
        List<Student> students=(List<Student>) BaseDao.findAllCriteria(Student.class);
        for (Student student : students) {
            System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName());
        }
    }

分页查询和Query接口类似,主要更dao层的主要查询语句。

    list=session.createCriteria(c).setFirstResult(0).setMaxResults(2).list();

加条件用add()方法,里面用Restrictions类,调用其中的包静态方法。

list=session.createCriteria(c).setFirstResult(0).setMaxResults(2).add(Restrictions.ilike("stuName", "%学%")).list();

排序用addOrder()方法,Order.asc(“id”)其中填写的是类的属性名称

    list=session.createCriteria(c).setFirstResult(0).setMaxResults(2).add(Restrictions.ilike("stuName", "%学%")).addOrder(Order.asc("id")).list();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值