Hibernate中的数据查询(二)
来源:互联网 发布:程序员图片 编辑:程序博客网 时间:2024/05/18 14:46
先来回忆下对象状态,实体类在Hibernate中有三种状态,分别是瞬时、持久和脱管状态。
- 瞬时就是实体类没有和Hibernate没有任何关系,在数据库中也没有对应的记录,JVM消失这个对象也就消失了,也就是new了一个对象。
- 持久就是对象和Hibernate发生了关系,有对应的session,并且在数据库中有对应的记录,代码中session的save就将该对象保存在了数据库中,该对象也和session发生了关系,所以此时是持久的。
- 脱管就是虽然在数据库中有对应的记录,但是他对应的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)
将此条记录删除即可。
如果我们是想我修改此条记录的数据呢,那么我们也一样
- 先根据id将此条记录查找出
- 修改该对象的属性
- 通过Session的update方法将变化数据更新到数据库中
//此处省略开头代码Product p=(Product)s.get(Product.class,6);p.setName("RoGuiYo");s.update(p);
这样我们就完成了一条数据的更新。
HQL
今天要看的就是Hibernate专门用于查询的语句HQL
- 根据HQL创建一个Query对象
- 设置参数
- 通过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的痕迹。
- 通过session的createCriteria创建一个criteria对象。
- Criteria.add增加约束,这次我们使用like的模糊查询方式
- 用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
- Hibernate中的数据查询(二)
- Hibernate中的数据查询方法
- Hibernate(二) Hibernate基本查询
- Hibernate中的createQuery查询一条数据、多条数据、分页查询数据
- hibernate分页查询二
- hibernate查询(二)
- Hibernate查询(二)
- Hibernate (二) 分页查询
- Hibernate查询方式(二)
- Hibernate学习:Hibernate数据查询
- 【Hibernate】Hibernate中的QBC查询
- Hibernate数据查询
- Hibernate数据查询
- Hibernate数据查询 (转帖)
- Hibernate数据查询
- Hibernate查询视图数据
- Hibernate数据查询
- Hibernate 数据查询
- 设计模式系列之十一组合模式
- python之模块三
- 从0到TrustZone第三篇:从QSEE劫持Linux内核
- 国际化与ajax
- Android简单的Toast工具类
- Hibernate中的数据查询(二)
- ruby:数组人生,患得患失
- ubuntu vmware tools
- Android Studio 快捷键使用
- jar 命令打包生成的jar文件内部的目录结构
- MySQL的一个安装坑
- webservice的学习
- 使用PreperedStatement预编译对象防止sql注入简单代码
- linear-gradient用法