前言:
HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下: Select/update/delete…… from (这里是不可省略的)…… where …… group by …… having …… order by …… asc/desc 其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。
正题:
还是接着上一篇博文来写,来做一个简单的HQL 操作,在做HQL操作之前需要拿到Query对象(org.hibernate.Query),怎么拿到这个Query对象呢?
session.createQuery(String hql)可以拿到Query对象,通过Query对象调 list()就可以拿到一个查询操作得到的集合。直接看代码:
package com.lagersoft.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.lagersoft.bean.Grade;
import com.lagersoft.bean.Student;
public class Test01 {
//HQL: select ... from ... where ... group by...having ...order by ...
//大致和SQL操作类似
public static void main(String[] args) {
//t1();
//t2();
//t3();
//t4();
t5();
}
//HQL之在查询的同时将数据装进对象里面,这里 select new Xxxx() from Xxxx...; new 注意后面这个对象需要给这个
//实体添加上相应的构造器 也就是 new Student(sid,stuname,grade) 如果实体没有空的构造器还需要添加上一个空的构造器
private static void t5() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("select new Student(sid,stuname,grade) from Student s");
List<Student> stuInfo = query.list();
for(Student s : stuInfo){
System.out.println(s.getStuname());
System.out.println(s.getSid());
System.out.println(s.getGrade());
}
session.close();
}
//HQL之查询多个属性值,这里给大家一个建议:无论是使用HQL或是SQL语句时不要使用 select * ...这样的语句,
//要使用多少个字段就select多少个字段,因为第一这样可以节省一些资源,提高效率,还有一点就是后期等你的
//程序升级时可能会给表添加字段或是有些字段可能会移出,到时候会比较麻烦(后果真的很严重)
private static void t4() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("select sid,stuname,grade from Student s");
List<Object[]> stuInfo = query.list();
for(Object[] s : stuInfo){
System.out.println(s[0]);
System.out.println(s[1]);
System.out.println(s[2]);
}
session.close();
}
//HQL之使用 select...from...这里同样要注意select后接java对象的属性名,from后接Java对象名,严格区分大小写
//查询单一属性时调用query的list方法时返回的是List<Object>
private static void t3() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("select stuname from Student");
List<Object> stuInfo = query.list();
for(Object s : stuInfo){
System.out.println(s.toString());
}
session.close();
}
//最普通的HQL代码,普通的代码 使用from ... from后面接的是java对象,可以省略全称,这里区分大小写
private static void t2() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("from Student");
List<Student> list = query.list();
for(Student s : list){
System.out.println("学生姓名:" + s.getStuname());
System.out.println("学生班级:" + s.getGrade().getGname());
}
session.close();
}
//创建基础数据
private static void t1() {
// 加载配置文件
Configuration cfg = new Configuration().configure();
// 获取会话工厂对象
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 通过会话工厂拿到一个会话,这个session可以看做是jdbc中Connection的作用
Session session = sessionFactory.openSession();
// 开始一个事务
Transaction transaction = session.beginTransaction();
Grade g = new Grade();
g.setGname("Class A");
g.getStudents().add(new Student("张三丰"));
// 这里的保存班级对象的同时会将班级中的学生保存到
session.save(g);
// 提交事务并关闭会话
transaction.commit();
session.close();
}
}
当然Hql有一些操作是比较特殊的,比如说HQL的集合运算
最后按照惯例还是附上源文件:源码DownLoad