HibernateのHQL操作

前言:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值