HibernateのHQL操作

来源:互联网 发布:时时彩组三报警软件 编辑:程序博客网 时间:2024/05/21 08:45

前言:

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

0 0