Hibernate查询方式

  • 2019 年 10 月 4 日
  • 笔记

查询方式

1.OID

2.HQL

3.QBC

01

OID查询

什么是OID查询?

通过domain类中(映射文件设置的)OID属性进行查询

有两种方法?

一个是get,一个是load

get是立马生成sql语句到数据库去查询并封装成指定对象然后返回

load它不会去立刻查询而是生成一个代理对象由于没有去查询它只包含你给的OID,直到你用到其他属性才会去查询给你

02

HQL方式

什么是HQL?

HQL查询:Hibernate Query Language,Hibernate的查询语言

是一种面向对象的方式的查询语言,语法类似SQL。

通过session.createQuery(),用于接收一个HQL进行查询方式。

简单查询

//查询整个表:createQuery("from 类名 (别名)")  Query query = session.createQuery("from Course");  List<Course> courses = query.list();  for (Course c : courses) {    System.out.println(c);  }

排序查询

//以整型属性排序:createQuery("from 类名 order by 属性 desc ")  Query query = session.createQuery("from Course order by course_id desc ");  List<Course> courses = query.list();  for (Course c : courses) {    System.out.println(c);  }

条件查询

//createQuery("from 映射类 where course_id=:代名 and course_name=:代名 ")  //query.setParameter("代名",值);  Query query = session.createQuery("from Course where course_id=:a and course_name=:b ");  query.setParameter("a",1);  query.setParameter("b","语文");  List<Course> courses = query.list();  for (Course c : courses) {    System.out.println(c);  }

投影查询

//createQuery("select 类名(别称).属性 from 类名 (别称)")  Query query = session.createQuery("select c.course_id from Course c");  List<Object> courses = query.list();  for (Object c : courses) {    System.out.println(c);  }

分页查询

//createQuery("from Course")  //setFirstResult(行号)  //setMaxResult(条数)  //行号从零开始  Query query = session.createQuery("from Course");  query.setFirstResult(1);  query.setMaxResults(2);  List<Object> courses = query.list();  for (Object c : courses) {    System.out.println(c);  }

统计查询

//count()  //单个结果uniqueResult()  Query query = session.createQuery("select count(*) from Course");  Object o = query.uniqueResult();  System.out.println(o);

分组查询

Query query = session.createQuery("select stu_age,count(*) from Student group by stu_age");  List<Object[]> list = query.list();  for(Object[] o : list){    System.out.println(Arrays.toString(o));  }

多表查询-普通内连接

//createQuery("from 类名 别名 inner join 别名.关联属性")  //left join、right join  //查完得到集合每个元素两个对象  Query query = session.createQuery("from Student s inner join s.stu_class");  List<Object[]> list = query.list();  for(Object[] o : list){    System.out.println(Arrays.toString(o));  }

多表查询-迫切内连接

//createQuery("from 类名 别名 inner join fetch 别名.关联属性")  //得到另外一个表对象封装在这个表的关联属性中,集合元素就是此类对象  Query query = session.createQuery("from Student s inner join fetch s.stu_class");  List<Object[]> list = query.list();  for(Object[] o : list){    System.out.println(Arrays.toString(o));  }

03

QBC方式

什么是QBC?

Query By Criteria,条件查询。是一种更加面向对象化的查询的方式因此比起HQL更加的方便。

简单查询

//createCriteria(类名.class)  Criteria criteria = session.createCriteria(Course.class);  List<Course> list = criteria.list();  for(Course c : list){    System.out.println(c);  }

分页查询

//criteria.setFirstResult(行号);  //criteria.setMaxResults(条数);  Criteria criteria = session.createCriteria(Course.class);  criteria.setFirstResult(0);  criteria.setMaxResults(2);  List<Course> list = criteria.list();  for(Course c : list){    System.out.println(c);  }

排序查询

//criteria.addOrder(Order.desc("属性名"))  Criteria criteria = session.createCriteria(Course.class);  criteria.addOrder(Order.desc("course_id"));  List<Course> list = criteria.list();  for(Course c : list){    System.out.println(c);  }

条件查询

符号

表达方法

=

eq

>

gt

>=

ge

<

lt

<=

le

<>

ne

like

like‍

in

in‍

or

or

and

and

//Restrictions.eq("属性名",值)  Criteria criteria = session.createCriteria(Course.class);  criteria.add(Restrictions.eq("course_id",1));  List<Course> list = criteria.list();  for(Course c : list){    System.out.println(c);  }
Criteria criteria = session.createCriteria(Course.class);  criteria.add(Restrictions.or(Restrictions.eq("course_id",1),Restrictions.like("course_name","语%")));  List<Course> list = criteria.list();  for(Course c : list){    System.out.println(c);  }

统计查询

//setProjection(Projections.rowCount())  Criteria criteria = session.createCriteria(Course.class);  criteria.setProjection(Projections.rowCount());  Object o = criteria.uniqueResult();  System.out.println(o);

离线条件查询

脱离Session,添加条件

可以在外部提前使用DetachedCriteria对象提交设置好条件

最后再绑定到session当中

public void lxTest(){     Session session = HibernateUtil.openSession();     DetachedCriteria dc = DetachedCriteria.forClass(Course.class);     dc.add(Restrictions.like("course_name","语%"));     //之前都是直接用session得到查询对象再操作     //现在可以先写完最后添加到session进行会话     Criteria c = dc.getExecutableCriteria(session);     List<Course> list = c.list();  }