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);}}
- J2EE系列之Hibernate4学习笔记(十六)--hibernate查询方式
- J2EE系列之Hibernate4学习笔记(一)--Hibernate简介
- J2EE系列之Hibernate4学习笔记(十九)--hibernate高级配置(配置hibernate二级缓存)
- J2EE系列之Hibernate4学习笔记(十七)--hibernate高级配置(配置连接池)
- J2EE系列之Hibernate4学习笔记(十八)--hibernate高级配置(配置日志框架log4j)
- J2EE系列之Hibernate4学习笔记(六)--Hibernate中对象的4种状态
- J2EE系列之Hibernate4学习笔记(八)--Hibernate基本类型映射
- J2EE系列之Hibernate4学习笔记(九)--Hibernate集合类型映射
- J2EE系列之Hibernate4学习笔记(十五)--hibernate检索策略
- J2EE系列之Hibernate4学习笔记(十三)-- -一对一映射
- J2EE系列之Hibernate4学习笔记(十)--Hibernate继承关系映射(每个具体类对应一个表)
- J2EE系列之Hibernate4学习笔记(十一)--Hibernate继承关系映射(根类对应一个表)
- J2EE系列之Hibernate4学习笔记(十二)--Hibernate继承关系映射(每个类对应一个表)
- J2EE系列之Hibernate4学习笔记(二)--Hibernate4增删改查体验
- J2EE系列之Hibernate4学习笔记(三)--映射对象标识符(OID)
- J2EE系列之Hibernate4学习笔记(四)--关联关系一对多映射
- J2EE系列之Hibernate4学习笔记(五)--关联关系一对多映射
- J2EE系列之Hibernate4学习笔记(七)--Session常用方法
- Android 7.0 行为变更
- 有一群海盗(不多于20人),在船上比拼酒量。(穷举)
- 第4节---模拟登陆知乎
- 使用C语言简单模拟Linux的cat程序
- 配置 七牛云cdn 加速
- J2EE系列之Hibernate4学习笔记(十六)--hibernate查询方式
- marquee标签
- JMeter接口测试
- JAVA 基本类型与 引用类型区别
- Docker(1)-- 如何安装Docker
- HelloKotlin(kotlin配置环境变量,kotlin hello world,kotlin 入门)
- groovy的集合 Range
- 关于ajax 返回的json数据动态展现在jsp页面的问题 20170525
- 性能优化