• .Net转Java自学之路—Hibernate框架篇三(查询方式)


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

  • 相关阅读:
    左偏树——可以标记合并的堆
    主席树——多棵线段树的集合
    [中山市选2011]完全平方数 ——莫比乌斯函数
    决策单调性优化dp
    [NOI2015]寿司晚宴——状压dp
    【[国家集训队]等差子序列】
    线性基——数集压缩自动机
    Java实现 蓝桥杯VIP 算法训练 筛选号码
    BSGS&EXBSGS 大手拉小手,大步小步走
    CRT&EXCRT 中国剩余定理及其扩展
  • 原文地址:https://www.cnblogs.com/zltao/p/10464854.html
Copyright © 2020-2023  润新知