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

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;
	}
	
	@Override
	public 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;
	@Before
	public void setUp() throws Exception {
		session=sessionFactory.openSession(); // 生成一个session
	    session.beginTransaction(); // 开启事务
	}

	@After
	public void tearDown() throws Exception {
		session.getTransaction().commit(); // 提交事务
	    session.close(); // 关闭session
	}

	@Test
	public void testSQLQuery() {
		
		
	}
	
	
}
运行testSQLQuery方法,先看一下生成的数据表,并给数据表中添加部分测试数据:


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

@Test
	public 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岁的学生,写新的测试方法:

@Test
	public 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普通查询:查询所有学生信息

测试方法如下:

@Test
	public 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岁的学生

@Test
	public 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.使用别名

@Test
	public 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的升序进行排列,我们现在按照年龄进行降序排序

@Test
	public 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个学生信息

@Test
	public 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.查询单个对象:有的时候我们完全确认我们查询的就是一体数据

@Test
	public 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岁的学生为例,采用链式写法

@Test
	public 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.普通查询:查询所有学生信息

@Test
	public 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.带条件查询:

@Test
	public 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.对结果排序

@Test
	public 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.分页查询

@Test
	public 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.查询单个对象:确信查询的对象只有一个

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

6.链式写法

@Test
	public 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值