Hibernate查询方式:
1、对象导航查询:根据id查询出一的数据,再根据一的查询结果查询多的数据。
OnlyClass only=session.get(OnlyClass.class,1); Set<MoreClass> mroe = only.getSetMoreClass();
2、OID查询:根据id查询某一条记录,返回对象。
OnlyClass only=session.get(OnlyClass.class,1);
3、HQL查询:Query对象,写hql语句实现查询。
//查询所有 Query query = session.createQuery("from OnlyClass"); List<OnlyClass> list=query.list(); for(OnlyClass only:list){ }
》条件查询:from 实体类名称 where 实体类属性名称=?and .....
Query query = session.createQuery("from OnlyClass where column=?"); //向?赋值:setParameter()的俩个参数: //第一个参数:int类型,是?的位置;从0开始 //第二个参数:具体参数值 query.setParameter(0,"条件值"); List<OnlyClass> list=query.list(); for(OnlyClass only:list){ }
》排序查询:from 实体类 order by 实体属性名称 ASC/DESC
Query query = session.createQuery("from OnlyClass order by column DESC"); List<OnlyClass> list = query.list(); for(OnlyClass only:list){ }
》分页查询:在hql操作中,在语句中不能使用limit,hibernate的Query对象封装了俩个方法来实现分页。
Query query = session.createQuery("from OnlyClass"); //设置分页 query.setFirstResult(0);//分页开始位置 query.setMaxResults();//每页记录数 List<OnlyClass> list=query.list(); for(OnlyClass only:list){ }
》投影查询:查询的不是所有字段,而是指定的一部分字符。
select 实体属性,实体属性 from 实体类 hql中不支持select * 的书写格式。
Query query = session.createQuery("select col1,col2,col3 from OnlyClass"); List<OnlyClass> list=query.list(); for(OnlyClass only:list){ }
》聚集查询:count、sum、avg、max、min常用聚集函数。 select count(*) from 实体类
Query query = session.createQuery("select count(*) from OnlyClass"); Object obj = query.uniqueResult(); Long lo =(Long)obj; int count=lo.intValue();
》内连接:
Query query = session.createQuery("from OnlyClass o inner join o.setMoreClass"); List list=query.list();//每部分是数组。
》迫切内链接:
1、迫切内链接与内链接的底层实现都是一样的。
2、区别:使用内链接返回list中每部分是数组,迫切内链接返回list每部分时对象。
Query query = session.createQuery("from OnlyClass o inner join fetch o.setMoreClass"); List list=query.list();//每部分是对象。
》左外连接:
Query query = session.createQuery("from OnlyClass o left outer join o.setMoreClass"); List list=query.list();//每部分是数组。
》迫切左外连接:
Query query = session.createQuery("from OnlyClass o left outer join fetch o.setMoreClass"); List list=query.list();//每部分是对象。
》右外连接:
Query query = session.createQuery("from OnlyClass o right outer join o.setMoreClass"); List list=query.list();//每部分是数组。
》迫切右外连接:
Query query = session.createQuery("from OnlyClass o right outer join fetch o.setMoreClass"); List list=query.list();//每部分是对象。
4、QBC查询:使用Criteria对象中的方法来实现查询。使用QBC时,操作的是实体类和属性。
》查询所有:
Criteria cti = session.createCriteria(OnlyClass.class); List<OnlyClass> list = cti.list();
》条件查询:
Criteria cti = session.createCriteria(OnlyClass.class); //设置条件值,首先使用add()表示设置条件值 //在add()中使用类的方法实现条件设置。 cti.add(Restrictions.eq("column",值));//eq表示等号 cit.add(Restrictions.like("column2","%值%"));//模糊 List<OnlyClass> list = cti.list();
》排序查询:
Criteria cti = session.createCriteria(OnlyClass.class); //设置对那个属性进行排序,设置排序规则。 cti.addOrder(Order.desc("column"));
》分页查询:
Criteria cti = session.createCriteria(OnlyClass.class); //设置分页数据 cti.setFirstResult(0);//分页开始位置。 cti.setMaxResult(10);//分页每页记录数。 List<OnlyClass> list = cti.list();
》统计查询:
Criteria cti = session.createCriteria(OnlyClass.class); //设置 cti.setProjection(Projections.rowCount());//统计数据 Object obj = cti.uniqueResult(); long lo=(Long)obj; int count=lo.intValue();
》离线查询:
DetachedCriteria decti = DetachedCriteria.forClass(OnlyClass.class); decti.getExecutableCriteria(session); List<OnlyClass> list = decti.list();
5、本地SQL查询
》SQLQuery对象,使用普通sql实现查询。
Hibernate检索策略:
概念:
hibernate检索分为俩类:
》立即检索(查询):根据id查询,调用get方法,马上发送语句查询数据库。
》延迟检索(查询):根据id查询,调用load(),调用load()方法不会马上发送语句查询数据库,只有得到对象里面的值才会发送语句查询数据库。
延迟查询分成俩类:
》》类级别延迟:根据id查询返回实体类对象,调用load()方法不会马上发送语句。
》》关联级别延迟:查询OnlyClass中的信息,再查询MoreClass中的信息,查询OnlyClass中信息的MoreClass数据的过程是否需要延迟,这个过程称为关联级别延迟。
//根据id查询OnlyClass的数据信息。 OnlyClass only=session.get(OnlyClass.class,1); //再查询OnlyClass的id为1的MoreClass的set集合数据。 //得到set集合。没有发送语句 Set<MoreClass> more=only.getSetMroeClass(); more.size();//发送语句
关联级别延迟操作:在映射文件中进行配置实现。
根据OnlyClass得到MoreClass的所有数据。
在<set>标签中采用俩个属性fetch和lazy:
fetch:值 select
lazy:值 true、延迟。false、不延迟。extra、极其延迟
默认效果:fetch="select" lazy="true"
fetch="select" lazy="false":调用get(),发送两条语句
fetch="select" lazy="extra":极其懒惰,要什么给什么
批量抓取:
未配置批量抓取时获取所有数据:性能差。
//获取OnlyClass所有的数据 Criteria cti = session.createCriteria(OnlyClass.class); List<OnlyClass> list=cti.list(); //获取MoreClass的所有数据 for(OnlyClass only : list){ Set<MoreClass> more=only.getSetMoreClass(); for(MoreClass mc : list){} }
优化:使用批量抓取获取所有数据。
在配置文件中set标签配置batch-size="2",该属性值越大性能越高。值越大发送语句越少。