Hibernate中的数据查询(二)

来源:互联网 发布:程序员图片 编辑:程序博客网 时间:2024/05/18 14:46

先来回忆下对象状态,实体类在Hibernate中有三种状态,分别是瞬时、持久和脱管状态。

  1. 瞬时就是实体类没有和Hibernate没有任何关系,在数据库中也没有对应的记录,JVM消失这个对象也就消失了,也就是new了一个对象。
  2. 持久就是对象和Hibernate发生了关系,有对应的session,并且在数据库中有对应的记录,代码中session的save就将该对象保存在了数据库中,该对象也和session发生了关系,所以此时是持久的。
  3. 脱管就是虽然在数据库中有对应的记录,但是他对应的session关闭了。

通过ID获取一个对象
通常都是调用session的get方法来获取对象,而其是根据id来获取对象的,除此之外还要传递一个类对象,至少你要让程序知道你要获取的是哪个对象。其实除了get方法,你也可以使用load方法获取对象,关于get方法和load的区别,后面再详细说,此处留位置。

下面是获取对象的那个代码

        Product p =(Product) s.get(Product.class, 6);

此语句的作用就是取出id为6的记录,如果我们需要将id为6的记录删除,那么我们就可以利用上面的语句先将id为6的记录查找出来,然后在利用语句s.delete(p)将此条记录删除即可。

如果我们是想我修改此条记录的数据呢,那么我们也一样

  1. 先根据id将此条记录查找出
  2. 修改该对象的属性
  3. 通过Session的update方法将变化数据更新到数据库中
//此处省略开头代码Product p=(Product)s.get(Product.class,6);p.setName("RoGuiYo");s.update(p);

这样我们就完成了一条数据的更新。


HQL
今天要看的就是Hibernate专门用于查询的语句HQL

  1. 根据HQL创建一个Query对象
  2. 设置参数
  3. 通过Query的list方法获取结果。
String name="RoGuiYo";//使用hql的时候不用再前面加selectQuery q=s.createQuery(" from Product where name like ?");//此处和PreparedStatement不一样,Query时从0开始的q.setString(0,"%"+name+"%");List<Product> datas=q.list();for(Product s:datas){    System.out.print(s.getName());}

Criteria
这个是完全以面向对象的方式在进行操作,基本看不到sql的痕迹。

  1. 通过session的createCriteria创建一个criteria对象。
  2. Criteria.add增加约束,这次我们使用like的模糊查询方式
  3. 用list获取查询到的数据
Criteria cri=s.createCriteria(Product.class);//此处需要什么约束用Restrictions的约束方法c.add(Restrictions.like("name","%"+name+"%"));List<Product> datas=cri.list();for(Product s:datas){    System.out.print(s.getName());}

这也可以用来进行分页数据查询,这时候无论你用的是什么数据库,分页查询的代码都是一样的。
分页查询时的代码:

SessionFactory sf=new Configuration().configure().buildSessionFactory();        Session s=sf.openSession();        s.beginTransaction();        String name="csdn";        Criteria c=s.createCriteria(Product.class);        c.add(Restrictions.like("name", "%"+name+"%"));        c.setFirstResult(5);//表示从第五条数据开始进行查询        c.setMaxResults(5);//表示一共查询5条数据        List<Product> ps=c.list();        for(Product p:ps){            System.out.println(p.getName());        }

SQL
其实在hibernate中也是可以用sql进行查询的,比如多表的联合查询、分组统计等,这时候用SQL查询效率就比较高。

我们用createSQLQuery()方法执行标准的SQL语句。
因为标准的SQL语句可能返回各种各样的结果,我们不能保证它查询的结果就一定能放进一个Product对象中,所以返回的集合里每一个元素都是一个对象数组,然后再根据下标将对象数组中的数据取出来。

String name="RoGuiYo";String sql="select * from product_ where name like '%"+name+"%'";Query q=s.createSQLQuery(sql);List<Object[]> datas=q.list();for(Object[] ds:datas){    for(Object s:ds){        //此处会输出每个对象数组中的所有数据        System.out.print(s+"   ");    }    System.out.print("\n");}
0 0
原创粉丝点击