Hibernate中的查询笔记:HQL
创建查询:
第一步:建立数据库连接
Session session=HibernateSessionFactory.getSession();
//从持久层得到整个表
Query query=session.createQuery("from com.tb.test.pojo.Teacher");
//得到结果
return query.list();
这是用HQL查询全部的写法;
在持久层中对于数据的操作,只有增删改需要涉及到事务,查就不需要了;
针对insert和update、delete进行hql的操作时,只有insert不支持;
public void save(Teacher t){
//建立数据库连接
Session session=HibernateSessionFactory.getSession();
//开启事物
Transaction tx= session.beginTransaction();
//方法1:直接数据保存到持久层。由持久层负责和数据库同步
//session.save(t);
//方法2.数据通过持久层同步到数据库。并持久化到pojo才操作结束
//session.persist(t);
//方法3.如果对象的id已经存在自动是修改。如果主键不存在就是新增
//session.saveOrUpdate(t);
//方法4.不支持采用HQL insert
session.createQuery("insert into Teacher values(?,?)")
.setBigDecimal(0, new BigDecimal(5))
.setString(1, "猪")
.executeUpdate();//这句话不能省
tx.commit();
}
//编辑
public void update(Teacher t){
//建立数据库连接
Session session=HibernateSessionFactory.getSession();
//开启事物
Transaction tx= session.beginTransaction();
//方法1.如果对象的id已经存在自动是修改。如果主键不存在就是新增
//session.saveOrUpdate(t);
//方法2
//session.update(t);
//方法3.采用HQL
session.createQuery("update Teacher set tname=? where id=?")
.setString(0, "衬衣")
.setBigDecimal(1, new BigDecimal(4))
.executeUpdate();//这句话不能省
tx.commit();
}
/**
* 删除
* @param t
*/
public void del(BigDecimal id){
//建立数据库连接
Session session=HibernateSessionFactory.getSession();
//开启事物
Transaction tx= session.beginTransaction();
//方法1
//session.delete(t);
//方法2
//session.delete(session.load(Teacher.class, id));
//方法3.采用HQL
session.createQuery("delete from Teacher where id=?")
.setBigDecimal(0, id)
.executeUpdate();//这句话不能省
tx.commit();
}
**
* HQL的各种玩法
*/
public void testHQL(){
//建立链接
Session session=HibernateSessionFactory.getSession();
//关于外键问题
//Query query=session.createQuery("from com.tb.test.pojo.Class1");
//获得结果
//如何过去外键的数据。比方获取老师姓名信息
//根据数据库的sql需要采用inner join,。而hibernate不需要
// for(Class1 tmp:list){
// System.out.print(tmp.getCname()+"--"+tmp.getCid());
// Teacher t= tmp.getTeacher();
// System.out.println("\t"+t.getTname());
// }
//条件查询
//1.通过?索引
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cname=?")
// .setString(0, "java1");
//2.通过参数名字查询
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cname= :xname")
// .setString("xname", "java1");
//参数传递的方法1.参数是什么类型。setXXX,XXX就要改成什么类型。架构师不容易封装
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cname= :xname")
// .setString("xname", "java1");
//参数绑定的方法2.遇到特殊类型可能不稳定
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cid= :xname")
// .setParameter("xname", 1);
// //参数绑定的方法3
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cid= :xname")
// .setParameter("xname", new BigDecimal(1),Hibernate.BIG_DECIMAL);
//如果绑定的参数是外键
//写法1.
//Teacher t=(Teacher)session.load(Teacher.class, new BigDecimal(1));
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where teacher= :teacher")
// .setEntity("teacher", t);
// //写法2
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where teacher= :teacher")
// .setParameter("teacher", t,Hibernate.entity(Teacher.class));
//between ..and
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where tid between ? and ?")
// .setBigDecimal(0, new BigDecimal(1))
// .setBigDecimal(1, new BigDecimal(2));
//> >= < <= != like is null
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cid!=?")
// .setBigDecimal(0, new BigDecimal(1));
//
//逻辑查询的and
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cid=? and cname=?")
// .setBigDecimal(0, new BigDecimal(1))
// .setString(1, "java2");
//or
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cid=? or cname=?")
// .setBigDecimal(0, new BigDecimal(1))
// .setString(1, "java2");
//not
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where not cid=? ")
// .setBigDecimal(0, new BigDecimal(1));
//排序
// Query query=session.createQuery("from com.tb.test.pojo.Class1 order by cid desc");
//in
//普通数值
// Object params[]={"java1","java2"};
// List paraList=new ArrayList();
// paraList.add("java1");
//数组
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cname in(:ins)")
// .setParameterList("ins",params);
//集合
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where cname in(:ins)")
// .setParameterList("ins",paraList);
//in的条件是外键
// Query query=session.createQuery("from com.tb.test.pojo.Class1 where teacher in(from com.tb.test.pojo.Teacher)");
//多态查询.HQL默认是立即检索。表的所有从表会全部加载到内存
//无疑就会很慢。因为用户并不需要那么多的从表数据。他却都加载了。
//此时我们要采用多态查询。过滤掉没有用的对象
// Query query=session.createQuery("select departments from com.tb.test.pojo.Employees");
//分页查询
// Query query=session.createQuery("from com.tb.test.pojo.Employees")
// .setMaxResults(10)
// .setFirstResult(21);
//联结查询:查询优化。联结查询不需要on语句
//不需要on。因为两个表之间的关系已经呗hibernate封装了。
//内联接
Query query=session.createQuery("from com.tb.test.pojo.Employees e inner join e.departments");
//左外
//Query query=session.createQuery("from com.tb.test.pojo.Employees e left outer join e.departments");
//右外
//Query query=session.createQuery("from com.tb.test.pojo.Employees e right outer join e.departments");
//全外。不支持全外。通过native-sql或者视图或者存储过程
//Query query=session.createQuery("from com.tb.test.pojo.Employees e full join e.departments");
//进入持久层的方法:就是迫切的检索策略。采用fetch
//以上查询的查询结果都是散列的。因为联结查询已经把查询结果缩小范围
//已经破坏了持久层对象和对象间的完整关系。结果孤独的存放到用户的内存而不是持久层
//如果并发和分布式的环境下显然效率不高。
//散列对象的遍历方式
//List list=query.list();
//System.out.println(((Object[])list.get(1))[0]);
// for (Iterator iterator = list.iterator(); iterator.hasNext();) {
// Object[] object = (Object[]) iterator.next();
// for (int i = 0; i < object.length; i++) {
// if(i==0)
// {
// Employees emp= (Employees)object[i];
// System.out.println(emp.getFirstName());
// }else{
// Departments emp= (Departments)object[i];
// System.out.println(emp.getDepartmentName());
// }
// }
// }
//散列对象的遍历方式
//在XXX join fetch表示这个查询结果虽然和持久层的标结果数据不一致。因为他只会得到联结的一部分数据。但是我们通过fetch告诉持久层,这都不是事(持久层认为没关系。我照样进入持久层)。
//迫切内
//Query query=session.createQuery("from com.tb.test.pojo.Employees e inner join fetch e.departments");
//迫切左
// Query query=session.createQuery("from com.tb.test.pojo.Employees e left join fetch e.departments");
//迫切右
//需要注意的是,只有新版本的hibernate3.2支持迫切左。老版的hibernate只支持迫切右
//Query query=session.createQuery("from com.tb.test.pojo.Employees e right join fetch e.departments");
//不支持全外迫切
//Query query=session.createQuery("from com.tb.test.pojo.Employees e full join fetch e.departments");
//System.out.println(((Object[])list.get(1))[0]);
// for (Iterator iterator = list.iterator(); iterator.hasNext();) {
// Object[] object = (Object[]) iterator.next();
// for (int i = 0; i < object.length; i++) {
// if(i==0)
// {
// Employees emp= (Employees)object[i];
// System.out.println(emp.getFirstName());
// }else{
// Departments emp= (Departments)object[i];
// System.out.println(emp.getDepartmentName());
// }
// }
// }
//Query query=session.createQuery("select count(employeeId),avg(salary),max(salary),min(salary),sum(salary) from com.tb.test.pojo.Employees");
//将散列的统计分析进入持久层
//Query query=session.createQuery("select new com.tb.test.pojo.EmpAna(count(e.employeeId),avg(e.salary),max(e.salary),min(e.salary),sum(e.salary)) from com.tb.test.pojo.Employees e");
//分组查询,统计分析。将结果进入持久层
Query query=session.createQuery("select e.jobs.jobId, avg(e.salary) from com.tb.test.pojo.Employees e group by e.jobs.jobId");
//刚才讲解的把散列表进入持久层的方法将结果进入持久层
List list=query.list();
System.out.println(((Object[])list.get(0))[1]);
//System.out.println(((Object[])list.get(0))[1]);
}