HQL查询方式
这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。
示例:
Session session = SessionFactory.getCurrentSession(); User user = null; Transaction ts = session.beginTransaction(); try { Query query = session.createQuery("from User as u where name='ijse'"); user= (User) query.list().get(0); session.commit(); } catch (HibernateException ex) { ts.rollBack(); ex.printStackTrace(); } System.out.println(user.getName());
QBC(Query By Criteria) 查询方式
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:
- 使用Session实例 的createCriteria()方法创建Criteria对象
- 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
- 使用Criteria对象的list()方法进行查询并返回结果
Restrictions类的常用方法:
Order类的常用方法:
方法名称 |
描述 |
Order.asc | 升序 |
Order.desc | 降序 |
Projections类的常用方法
示例:
Session session = SessionFactory.getCurrentSession(); User user = null; Transaction ts = session.beginTransaction(); try { Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq("name","ijse")); user= (User) criteria.list().get(0); session.commit(); } catch (HibernateException ex) { ts.rollBack(); ex.printStackTrace(); } System.out.println(user.getName());
QBE(Query By Example)查询方式
将一个对象的非空属性作为查询条件进行查询。
示例:
Session session = SessionFactory.getCurrentSession(); User user = new User(); user.setName("ijse"); Transaction ts = session.beginTransaction(); try { Criteria criteria = session.createCriteria(User.class); criteria.add(Example.create(user)); user= (User) criteria.list().get(0); session.commit(); } catch (HibernateException ex) { ts.rollBack(); ex.printStackTrace(); } System.out.println(user.getName());
离线查询
离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。
示例:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class); detachedCriteria.add(Restrictions.eq("name","ijse"); Session session = SessionFactory.getCurrentSession(); User user = new User(); Transaction ts = session.beginTransaction(); try { Criteria criteria = detachedCriteria.getExecutableCriteria(session); user= (User) criteria.list().get(0); session.commit(); } catch (HibernateException ex) { ts.rollBack(); ex.printStackTrace(); } System.out.println(user.getName());
复合查询
复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。
示例:
Session session = SessionFactory.getCurrentSession(); User user = new User(); Transaction ts = session.beginTransaction(); try { Criteria criteria1 = session.createCriteria(Room.class); Criteria criteria2 =criterial1.createCriteria("User"); criteria2.add(Restrictions.eq("name",new String("ijse")); user= (User) criteria.list().get(0); session.commit(); } catch (HibernateException ex) { ts.rollBack(); ex.printStackTrace(); } System.out.println(user.getName());
分页查询
分页查询主要是要指定两个参数:从第几条数据开始,取多少条数据。可以通过调用Query或者Criteria对象的setFirstResult()和setMaxResults()方法分别进行设定。
示例:
Session session = SessionFactory.getCurrentSession(); List userList = null; Transaction ts = session.beginTransaction(); try { Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(0);//从第一个数据开始 criteria.setMaxResults(10);//取10条记录 userList = (List) criterial.list(); session.commit(); } catch (HibernateException ex) { ts.rollBack(); ex.printStackTrace(); }