版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sv2008337/article/details/81355728
上一节讲了Hibernate的配置,这一节介绍下Hibernate的一些查询。
1、Hibernate中的几种查询:
- a、OID查询:根据id查询,get和load;
- b、SQL查询:
SQLQuery;
Session中的dowork方法,它可以拿到Connection
- c、HQL查询:使用HQL语句查询数据库;
- d、QBC查询:使用Criteria对象查询数据库;
2、hibernate中的Query对象:
它是hibernate中HQL查询方式
- a、如何获得该对象;
session对象的方法
- b、涉及到对象和方法;
createQuery(String hql)
- c、方法参数中的含义:
SQL:select '数据库中的列名' from '数据库的表名'
HQL:select '类中的属性名' from '类名'
HQL语句,是把sql语句的表名换成类名,把字段名换成实体类中的属性名称
3、hibernate对象三种状态:
- 瞬时状态(临时状态):没有OID、与session没关系;
- 持久化状态:有OID,与session有关系,只有持久化的状态才有一级缓存的概念;
- 托管状态:有OID,与session没关系;
- 删除状态:有OID,和session有关系,同时调用了删除方法,即将从数据库中删除,还没有提交;
4、几个Hibernate查询的Demo
//基本查询
public void test1(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Query对象
Qurery query=s.createQuery("from 类名称");
//获取结果集
List list=query.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//条件查询
public void test2(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Query对象
Qurery query=s.createQuery("from 类名称 where 类属性1 like :aaa and 属性名2= :bbb ");
query.setParameter("aaa","%xx%");//aaa与HQL中aaa对应,右边是赋值
query.setParameter("bbb","xxxx");
//获取结果集
List list=query.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//排序查询
//在HQL语句添加order by就可以了(desc)
//分页查询
public void test3(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Query对象
Qurery query=s.createQuery("from 类名称");
//这俩个方法不受数据库影响
//也就是说,mysql、Oracle等同样受用
query.setFirstResult(2);//设置查询的开始记录索引;
query.setMaxResults(2)//设置每次查询条数;
//获取结果集
List list=query.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//统计查询
public void test4(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Query对象
Qurery query=s.createQuery("from 类名称");
Long count =(Long) query.uniqueResult();//当返回结果唯一时成功,不唯一时出错
System.out.println(count);
tx.commit();
}
//统计查询
public void test5(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Query对象
Qurery query=s.createQuery("select new 你的包名路径(属性名1,属性名2) from 类名称");
//获取结果集
List list=query.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
5、用QBC进行查询的Demo
QBC,Query By Criteria,它是一种面向对象的查询方式,它能把生成语句的过程全部融入到方法当中了;
//基本查询
public void test1(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Criteria对象
Criteria c=s.createCriteria(类名.class);
//获取结果集
List list=c.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//条件查询
public void test2(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Criteria对象
Criteria c=s.createCriteria(类名.class);
c.add(Restrictions.eq("属性名","属性值"));
c.add(Restrictions.like("属性名","属性值"));
//获取结果集
List list=c.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//排序查询
public void test3(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Criteria对象
Criteria c=s.createCriteria(类名.class);
c.addOrder(Order.desc("custId"));
//获取结果集
List list=c.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//分页查询
public void test4(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Criteria对象
Criteria c=s.createCriteria(类名.class);
//这俩个方法不受数据库影响
//也就是说,mysql、Oracle等同样受用
c.setFirstResult(2);//设置查询的开始记录索引;
c.setMaxResults(2)//设置每次查询条数;
//获取结果集
List list=c.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
//统计查询
public void test4(){
//获取当前Session
Session s=HibernateUtil.getCurrentSession();
//创建事务
Transaction tx=s.beginTransaction();
//获取Criteria对象
Criteria c=s.createCriteria(类名.class);
c.setProjection(Projection.count("custId");
List list=c.list();
for(Object o:list)
{
System.out.println(o);
}
tx.commit();
}
最后,Criteria还一种查询,叫做离线查询,离线查询解决的弊端是:当用Criteria做查询时,Servlet出现持久层的session和事务对象,这是不允许的,这个时候得用离线操作,DetachedCriteria 不需要获取session。Demo如下:
public void test(){
//获取离线对象,不需要session
DetachedCriteria dc=DetachedCriteria(类名.class);
dc.add(Restrictions.eq("属性名","属性值"));
dc.add(Restrictions.like("属性名","属性值"));
List list=testService(dc);
for(Object o:list)
{
System.out.println(o);
}
}
private List testService(DetachedCriteria dc)
{
Session s=null;
Transaction tx
try
{
s=HibernateUtil.getCurrentSession();
tx=s.beginTransaction();
testDao(dc);
tx.commit();
return list;
}
catch(Exception e)
{
tx.rollback();
}
return null;
}
private List testDao(DetachedCriteria dc)
{
Session s=HibernateUtil.getCurrentSession();
Criteria c=dc.getExecutableCriteria(s);
return c.lis();
}