.Net转Java自学之路—Struts2框架篇三十七(Struts2入门)

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",该属性值越大性能越高。值越大发送语句越少。

猜你喜欢

转载自www.cnblogs.com/drop/p/10464854.html