J2EE系列之Hibernate4学习笔记(十六)--hibernate查询方式

来源:互联网 发布:淘宝网买家信用 编辑:程序博客网 时间:2024/06/08 19:05

Hibernate的查询方式主要有一下几种:

1,导航对象图查询方式:比如学生班级,查询学生的时候把学生所在的班级信息也查询出来,一种级联的方式;

2,OID 查询方式:比如session.get,session.load这种根据对象的OID标识符查询对象,这种方式只能查询单个对象;

3,本地SQL 查询方式:用本地数据库的sql查询方式查询,比如本机安装的是mysql数据库,那就按照mysql的sql语法来查询。这种方式的缺点是不能跨数据库

4,HQL 查询方式:最常用的查询方式,它是hibernate自定义的一种查询语言;

5,QBC 查询方式;(Query By Criteria):通过hibernate提供的接口进行查询,也是非常强大。


一、本地SQL查询方式

1.新建工程:Hibernate10

2.新建学生类Student:

package com.test.model;public class Student {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}}

3.写Student的映射文件:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.test.model"><class name="Student" table="t_student"><id name="id" column="stuId"><generator class="native"></generator></id><property name="name" column="stuName"></property><property name="age" column="stuAge"></property></class></hibernate-mapping>

4.把映射文件添加到Hibernate的配置文件中,写测试方法:

package com.test.service;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.test.model.Student;import com.test.util.HibernateUtil;public class StudentTest {private SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 获取Session工厂private Session session;@Beforepublic void setUp() throws Exception {session=sessionFactory.openSession(); // 生成一个session    session.beginTransaction(); // 开启事务}@Afterpublic void tearDown() throws Exception {session.getTransaction().commit(); // 提交事务    session.close(); // 关闭session}@Testpublic void testSQLQuery() {}}
运行testSQLQuery方法,先看一下生成的数据表,并给数据表中添加部分测试数据:


这里要查询所有的学生信息,修改测试方法为:

@Testpublic void testSQLQuery() {String sql = "select * from t_student";Query query = session.createSQLQuery(sql).addEntity(Student.class);List studentList = query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

我的电脑上面安装的是mysql数据库,这里就得按照mysql的语法来查询。程序运行结果为:

这里查询出来所有的学生信息。


下面查询姓张的,并且年龄为10岁的学生,写新的测试方法:

@Testpublic void testSQLQuery2() {String sql = "select * from t_student where stuName like :stuName and stuAge= :stuAge";Query query = session.createSQLQuery(sql).addEntity(Student.class);query.setString("stuName", "张%");query.setInteger("stuAge", 10);List studentList = query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

注意的是这里与mysql稍微不同的地方是上面的sql语言中需要写参数的地方不是使用的问号(?),而是使用的冒号+参数名的方式(:stuName,:stuAge),这里要注意冒号与前面的字符之间要有空格。

接下来使用query提供的方法给各个参数赋值。


运行这个测试方法:


可以看到hibernate还是把sql语句转成了mysql的查询方式。


二、HQL(Hibernate Query Language)是面向对象的查询语言;是使用最广的一种查询方式;

1.hql普通查询:查询所有学生信息

测试方法如下:

@Testpublic void testHQLQuery1() {String hql = "from Student";Query query = session.createQuery(hql);List<Student> studentList = (List<Student>)query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

注意hql语法,这里from后面加的是要查询的类名Student。后面使用createQuery方法,运行测试方法:


这里查询到了所有的学生信息。


2.带条件查询:查询姓张的并且年龄为10岁的学生

@Testpublic void testHQLQuery2() {String hql = "from Student where name like :stuName and age= :stuAge";Query query = session.createQuery(hql);query.setString("stuName", "张%");query.setInteger("stuAge", 10);List<Student> studentList = (List<Student>)query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

这里hql字符串里面条件名称直接使用的是类里面的属性名。运行测试函数:



3.使用别名

@Testpublic void testHQLQuery3() {String hql = "from Student as s where s.name like :stuName and s.age= :stuAge";Query query = session.createQuery(hql);query.setString("stuName", "张%");query.setInteger("stuAge", 10);List<Student> studentList = (List<Student>)query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

这里给查询类起了一个别名s,这种方式的可读性要好一些。运行测试方法:



4.对结果排序:默认是按照id的升序进行排列,我们现在按照年龄进行降序排序

@Testpublic void testHQLQuery4() {String hql = "from Student order by age desc";Query query = session.createQuery(hql);List<Student> studentList = (List<Student>)query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

运行测试方法:



5、分页查询:查询从第0个数据开始的2个学生信息

@Testpublic void testHQLQuery5() {String hql = "from Student";Query query = session.createQuery(hql);query.setFirstResult(0);query.setMaxResults(2);List<Student> studentList = (List<Student>)query.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

运行测试方法:



6.查询单个对象:有的时候我们完全确认我们查询的就是一体数据

@Testpublic void testHQLQuery6() {String hql = "from Student";Query query = session.createQuery(hql);query.setFirstResult(1);query.setMaxResults(1);Student student = (Student)query.uniqueResult();System.out.println(student);}

运行测试方法:



7.链式写法:以查询姓张的且年龄为10岁的学生为例,采用链式写法

@Testpublic void testHQLQuery7() {String hql = "from Student as s where s.name like :stuName and s.age= :stuAge";Query query = session.createQuery(hql);List<Student> studentList = (List<Student>)query.setString("stuName", "张%").setInteger("stuAge", 10).list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

运行测试方法:



四、QBC查询:QBC 查询方式(Query By Criteria)是用一套接口来实现的查询方式;

1.普通查询:查询所有学生信息

@Testpublic void testQBCQuery1() {Criteria criteria = session.createCriteria(Student.class);List<Student> studentList =(List<Student>) criteria.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

这里使用的是hibernate提供的接口,运行测试方法:



2.带条件查询:

@Testpublic void testQBCQuery2() {Criteria criteria = session.createCriteria(Student.class);Criterion c1 = Restrictions.like("name", "张%");Criterion c2 = Restrictions.eq("age", 10);criteria.add(c1);criteria.add(c2);List<Student> studentList =(List<Student>) criteria.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

设置两个查询条件,运行测试方法:



3.对结果排序

@Testpublic void testQBCQuery3() {Criteria criteria = session.createCriteria(Student.class);criteria.addOrder(Order.desc("age"));List<Student> studentList =(List<Student>) criteria.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

运行测试方法:



4.分页查询

@Testpublic void testQBCQuery4() {Criteria criteria = session.createCriteria(Student.class);criteria.setFirstResult(0);criteria.setMaxResults(2);List<Student> studentList =(List<Student>) criteria.list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}

这里查询从0开始的2条记录。


5.查询单个对象:确信查询的对象只有一个

@Testpublic void testQBCQuery5() {Criteria criteria = session.createCriteria(Student.class);criteria.setFirstResult(2);criteria.setMaxResults(1);Student student =(Student) criteria.uniqueResult();System.out.println(student);}

6.链式写法

@Testpublic void testQBCQuery6() {Criteria criteria = session.createCriteria(Student.class);List<Student> studentList =(List<Student>) criteria.setFirstResult(0).setMaxResults(2).list();Iterator it = studentList.iterator();while(it.hasNext()){Student s = (Student) it.next();System.out.println(s);}}


阅读全文
0 0
原创粉丝点击