四.Hibernate中对象的状态之间的转换
有三种状态: 1.瞬时状态:对象刚被创建,没有与Session 关联。 2.持久化状态:与Session建立关联,对象放入Session缓存中 3.游离状态:已经被持久化,但不再处于Session的缓存中
hibernate中对象三种状态之间的转换
六.Hibernate中的对数据库的复杂操作
1.批量查询
(1)HQL查询(hibernate query language)
步骤:1书写HQL语句——>根据HQL语句创建查询对象——>根据查询对象获取查询结果
//书写HQL语言(条件查询)
String hql="from 对象的完整类名 where 对象中的属性名=属性值";//相当于select *
//书写HQL语言(非条件查询)
String hql="select * from 对象的完整类名;//这里不是写表名,而是写数据库表所对应的对象的完整类名,这里的where 后面的条件名只能是对象中的属性名,不能是数据库的列名
//根据HQL语句创建查询对象
Query query=session.createQuery(hql);
//根据查询对象获取查询结果(查询出来结果为多个)
List list=query.list();//返回list结果
//根据查询对象获取查询结果(查询出来的结果只有一个或为空)
Customer c=(Customer)query.uniqueResult();
另一种方式(通过使用占位符):
//书写HQL语言(第一种占位符 “?” )
String hql="select * from 对象的完整类名 where 对象中的属性名=?";//这里?是占位位符
//书写HQL语言(第二种占位符 “:变量名” )
String hql="select * from 对象的完整类名 where 对象中的属性名=:cust_id";//变量名(可以随便起)
//根据HQL语句创建查询对象
Query query=session.createQuery(hql);
//设置参数,也是设置上面 “ ?” 的值
query.setParameter(0,1l);//这里的0代表第一个问号,1l:该问号代表的值
//设置参数,也是设置上面 " :变量名 " 的值
query.setParameter(“cust_id”,1l);//这里的“abc”和上面的abc对应,1l为占位符代表的值
//根据查询对象获取查询结果
List list=query.list();//返回list结果
设置分页信息
//书写HQL语言(非条件查询)
String hql="select * from
//根据HQL语句创建查询对象
Query query=session.createQuery(hql);
//设置分页
query.setFirstResult(1);//表示从记录的第几条开始
query.setMaxResult(3);//表示最大偏移量
//根据查询对象获取查询结果(查询出来多个对象)
List list=query.list();//返回list结果
(2)Criteria查询(无语句面向对象查询)
1.基本查询
这里是查询出所有Customer对象
//创建criteria查询对象
Criteria criteria=session.createCriteria(Customer.class);//查询所有的Cusotmer对象,参数为实
体类对象
//获取到查询到的对象的集合
List<Customer> list=criteria.list();//获取到查询到的对象的集合
2.条件查询
这里举出查询cust_id为1的Customer对象
Criteria criteria=session.createCriteria(Customer.class);
/*添加查询条件,参数为Restrictions类中的方法
表示 方法名
> : gt
>= :ge
< : lt
<= : le
== : eq
!= : ne
in : in
like : be
is not null: isNotNull
is null : isNull
or : or
and : and
*/
between and
criteria.add(Restrictions.eq("cust_id",1l));
Customer c=criteria.uniqueResult();
3分页查询
//创建criteria查询对象
Criteria criteria=session.createCriteria(Custoemr.class);
criteria.setFirstResult(1);//表示从记录的第几条开始
criteria.setMaxResults(3);//表示最大偏移量
List<Customer> list=criteria.list();
(3)原生sql查询
步骤:1书写sql语句——》创建sql查询对象——》获取查询对象
1.基本查询(注:需要将结果集绑定到所对应的类对象中)
//书写sql语句
String sql="select * from cst_customer";
//创建sql查询对象
SQLQuery query=session.createSQLQuery(sql);
//指定将结果集封装到所对应的类对象中(为了下面获取结果任然为Cusotmer)
query.addEntity(Customer.class);
//获取查询结果对象
List<Customer> list=query.list();//结果为多个
Customer customer=(Customer)query.uniqueResult();//查询结果为一个或为空
2.条件查询
//书写sql语句(这里使用占位符)
String sql="select * from cst_customer where cust_id=?";
//创建sql查询对象
SQLQuery query=session.createSQLQuery(sql);
//设置占位符的值
query.setParameter(0,1l);//0代表索引,1l代表值
//指定将结果集封装到所对应的类对象中(为了下面获取结果任然为Cusotmer)
query.addEntity(Customer.class);
//获取查询结果对象
List<Customer> list=query.list();//结果为多个
Customer customer=(Customer)query.uniqueResult();//查询结果为一个或为空
3.分页查询
//书写sql语句(使用占位符)
String sql="select * from cst_customer limit ?,?";
//创建sql查询对象
SQLQuery query=session.createSQLQuery(sql);
//设置占位符的值
query.setParameter(0,0);//0代表问号的索引,0代表第一条位置
query.setParameter(1,1);//1代表问号的索引,1代表偏移量
//指定将结果集封装到所对应的类对象中(为了下面获取结果任然为Cusotmer)
query.addEntity(Customer.class);
//获取查询结果对象
List<Customer> list=query.list();//结果为多个
Customer customer=(Customer)query.uniqueResult();//查询结果为一个或为空