Hibernate 查询方式简介:
1,导航对象图查询方式;
2,OID 查询方式;
3,本地 SQL 查询方式;
4,HQL 查询方式;
5,QBC 查询方式;(Query By Criteria)
导航对象图查询方式:根据已经加载的对象导航到其他对象
例如:在前面的各种映射关系中,实体类包含对其他类对象的引用。
Dept d = (Dept) session.get(Dept.class,2);
d.getStaffSet().size(); //d对象关联Staff集合,hibernate会自动检索Staff数据。如何检索的,看下面图中发送的sql语句。
OID 查询方式:按照对象的OID来检索对象
例如:session.get()/session.load(); 这里过多的阐述了。
本地 SQL 查询方式:使用标准的SQL语句来编写。
1.普通本地SQL查询(不带查询条件):
//本地SQL查询 @Test public void testSQL01() throws Exception { String sql = "select * from student"; //因为引用的是SQL 底层封装查询的都是Object 所以我们要绑定查询出来要绑定一个实体 addEntity Query query = session.createSQLQuery(sql).addEntity(Student.class); List<Student> list = query.list(); for(Student s:list){ System.out.println(s); } }
2:带查询条件的本地SQL查询:
@Test public void testSQL02() throws Exception { String sql = "select * from student where student_name like :studentName and student_age=:studentAge"; Query query = session.createSQLQuery(sql).addEntity(Student.class); query.setString("studentName", "张%"); query.setInteger("studentAge", 10); List<Student> list = query.list(); for(Student s:list){ System.out.println(s); } }
HQL 查询方式:,是面向对象的查询语言,它和SQL查询语言有些相似,在Hibernate提供的各种检索方式中,HQL是使用的最广的一种检索方式。
注意:HQL操作的全是POJO类中的属性,而不是操作数据库表中的字段。
1.不带查询条件的HQL查询:
@Test public void testHQL01() throws Exception { String hql = "from Student"; Query query = session.createQuery(hql); List<Student> list = query.list(); for(Student s:list){ System.out.println(s); } }
2.带查询条件的HQL查询(可使用别名 增强可读性):
@Test public void testHQL03() throws Exception { String hql = "from Student as s where s.studentName like :studentName and s.studentAge=:studentAge"; Query query = session.createQuery(hql); query.setString("studentName", "张%"); query.setInteger("studentAge", 10); List<Student> list = query.list(); for(Student s:list){ System.out.println(s); } }
3.HQL查询对结果排序:
@Test public void testHQL04() throws Exception { String hql = "from Student as s order by s.studentAge desc"; Query query = session.createQuery(hql); List<Student> list = query.list(); for(Student s:list){ System.out.println(s); } }
4.HQL查询分页处理:
@Test public void testHQL05() throws Exception { String hql = "from Student"; Query query = session.createQuery(hql); query.setFirstResult(1); query.setMaxResults(2); List<Student> list = query.list(); for(Student s:list){ System.out.println(s); } }
5.HQL查询单个对象:
@Test public void testHQL06() throws Exception { String hql = "from Student"; Query query = session.createQuery(hql); query.setFirstResult(1); query.setMaxResults(1); Student student = (Student)query.uniqueResult(); System.out.println(student); }
6.HQL查询链式写法:
@Test public void testHQL07() throws Exception { String hql = "from Student as s where s.studentName like :studentName and s.studentAge=:studentAge"; Query query = session.createQuery(hql); List<Student> list = query .setString("studentName", "张%") .setInteger("studentAge", 10) .list(); for(Student s:list){ System.out.println(s); } }
QBC 查询方式(Query By Criteria)是用一套接口来实现的查询方式
普通查询:
@Test public void testQBC01() throws Exception { Criteria criteria = session.createCriteria(Student.class); List<Student> list = criteria.list(); for(Student s:list){ System.out.println(s); } }
带条件查询:
@Test public void testQBC02() throws Exception { Criteria criteria = session.createCriteria(Student.class); Criterion c1 = Restrictions.like("studentName", "张%"); Criterion c2 = Restrictions.eq("studentAge", 10); criteria.add(c1); criteria.add(c2); List<Student> list = criteria.list(); for(Student s:list){ System.out.println(s); } }
对结果排序:
@Test public void testQBC03() throws Exception { Criteria criteria = session.createCriteria(Student.class); criteria.addOrder(Order.desc("studentAge")); List<Student> list = criteria.list(); for(Student s:list){ System.out.println(s); } }
分页查询:
@Test public void testQBC04() throws Exception { Criteria criteria = session.createCriteria(Student.class); criteria.setFirstResult(0); criteria.setMaxResults(2); List<Student> list = criteria.list(); for(Student s:list){ System.out.println(s); } }
单个对象查询:
@Test public void testQBC05() throws Exception { Criteria criteria = session.createCriteria(Student.class); criteria.setFirstResult(2); criteria.setMaxResults(1); Student student = (Student) criteria.uniqueResult(); System.out.println(student); }
链式写法:
@Test public void testQBC06() throws Exception { Criteria criteria = session.createCriteria(Student.class); List<Student> list = criteria .setFirstResult(0) .setMaxResults(2) .list(); for(Student s:list){ System.out.println(s); } }