Hibernate中的数据查询(二)

先来回忆下对象状态,实体类在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的时候不用再前面加select
Query 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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人圭先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值