Hibernate学习笔记

来源:互联网 发布:qq飞车战魂评测数据 编辑:程序博客网 时间:2024/06/07 01:15

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]);
 
}

原创粉丝点击