day37 hql语法

------------------hql语法

- 基础
String hql = " from  cn.itcast.domain.Customer ";//完整写法
        String hql2 = " from  Customer "; //简单写法
        String hql3 = " from java.lang.Object ";        
        Query query = session.createQuery(hql3);        
        List list = query.list();
- 排序
String hql1 = " from  cn.itcast.domain.Customer order by cust_id asc ";//完整写法
        String hql2 = " from  cn.itcast.domain.Customer order by cust_id desc ";//完整写法      
        Query query = session.createQuery(hql2);        
        List list = query.list();
- 条件
String hql1 = " from  cn.itcast.domain.Customer where cust_id =? ";//完整写法
        String hql2 = " from  cn.itcast.domain.Customer where cust_id = :id ";//完整写法        
        Query query = session.createQuery(hql2);        
//      query.setParameter(0, 2l);
        query.setParameter("id", 2l);           
        List list = query.list();
- 分页
String hql1 = " from  cn.itcast.domain.Customer  ";//完整写法       
        Query query = session.createQuery(hql1);        
        //limit ?,?
        // (当前页数-1)*每页条数
        query.setFirstResult(2);
        query.setMaxResults(2);
        
        List list = query.list();
- 聚合
String hql1 = " select count(*) from  cn.itcast.domain.Customer  ";//完整写法
        String hql2 = " select sum(cust_id) from  cn.itcast.domain.Customer  ";//完整写法
        String hql3 = " select avg(cust_id) from  cn.itcast.domain.Customer  ";//完整写法
        String hql4 = " select max(cust_id) from  cn.itcast.domain.Customer  ";//完整写法
        String hql5 = " select min(cust_id) from  cn.itcast.domain.Customer  ";//完整写法       
        Query query = session.createQuery(hql5);        
        Number number  = (Number) query.uniqueResult();

- 投影
String hql1 = " select cust_name from  cn.itcast.domain.Customer  ";
        String hql2 = " select cust_name,cust_id from  cn.itcast.domain.Customer  ";
        String hql3 = " select new Customer(cust_id,cust_name) from  cn.itcast.domain.Customer  ";      
        Query query = session.createQuery(hql3);        
        List list = query.list();
- 多表查询
//回顾-原生SQL
    // 交叉连接-笛卡尔积(避免)
//      select * from A,B 
    // 内连接
//      |-隐式内连接
//          select * from A,B  where b.aid = a.id
//      |-显式内连接
//          select * from A inner join B on b.aid = a.id
    // 外连接
//      |- 左外
//          select * from A left [outer] join B on b.aid = a.id
//      |- 右外
//          select * from A right [outer] join B on b.aid = a.id
//HQL的多表查询
        //内连接(迫切)
        //外连接
//          |-左外(迫切)
//          |-右外(迫切)
- hql多表语法
//HQL 内连接 => 将连接的两端对象分别返回.放到数组中.
String hql = " from Customer c inner join c.linkMens ";     
        Query query = session.createQuery(hql);     
        List<Object[]> list = query.list();     
        for(Object[] arr : list){
            System.out.println(Arrays.toString(arr));
        }
//HQL 迫切内连接 => 帮我们进行封装.返回值就是一个对象
String hql = " from Customer c inner join fetch c.linkMens ";       
        Query query = session.createQuery(hql);     
        List<Customer> list = query.list();
//HQL 左外连接 => 将连接的两端对象分别返回.放到数组中.
    String hql = " from Customer c left join c.linkMens ";
Query query = session.createQuery(hql);     
        List<Object[]> list = query.list();
//HQL 右外连接 => 将连接的两端对象分别返回.放到数组中.
    String hql = " from Customer c right join c.linkMens ";
        

-------------------criteria

- 基本
Criteria c = session.createCriteria(Customer.class);
        
        List<Customer> list = c.list();
- 条件
Criteria c = session.createCriteria(Customer.class);
        
//      c.add(Restrictions.idEq(2l));
        c.add(Restrictions.eq("cust_id",2l));
        
        List<Customer> list = c.list();
- 分页
Criteria c = session.createCriteria(Customer.class);
        //limit ?,? 
        c.setFirstResult(0);
        c.setMaxResults(2);
        
        List<Customer> list = c.list();
- 排序
Criteria c = session.createCriteria(Customer.class);
        
        c.addOrder(Order.asc("cust_id"));
        //c.addOrder(Order.desc("cust_id"));
        
        List<Customer> list = c.list();
- 统计

        Criteria c = session.createCriteria(Customer.class);
        
        //设置查询目标
        c.setProjection(Projections.rowCount());
        
        List list = c.list();
----------------离线与非离线区别在于是否是有session创建的criteria
@Test
    public void fun1(){
        //Service/web层
        DetachedCriteria dc  = DetachedCriteria.forClass(Customer.class);
        
        dc.add(Restrictions.idEq(6l));//拼装条件(全部与普通Criteria一致)
        
        //----------------------------------------------------
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //----------------------------------------------------
        Criteria c = dc.getExecutableCriteria(session);
        
        List list = c.list();
        
        System.out.println(list);
        //----------------------------------------------------
        tx.commit();
        session.close();
        
    }


----------------查询优化

  • 类级别优化是使用代理方式使之实体对象可以在使用时候才进行查询操作(类似将connection类的close方法重写)
  • get方法:没有任何策略.调用即立即查询数据库加载数据.
  • load方法: 应用类级别的加载策略
// load方法(默认):是在执行时,不发送任何sql语句.返回一个对象.使用该对象时,才执行查询.
    // 延迟加载: 仅仅获得没有使用.不会查询.在使用时才进行查询.
    // 是否对类进行延迟加载: 可以通过在class元素上配置lazy属性来控制.
        //lazy:true  加载时,不查询.使用时才查询b
        //lazy:false 加载时立即查询.
--------
<class name="Customer" table="cst_customer" lazy="false" >
-------------
        Customer c = session.load(Customer.class, 2l);

  • 集合策略
<!-- 
        lazy属性: 决定是否延迟加载
            true(默认值): 延迟加载,懒加载
            false: 立即加载
            extra: 极其懒惰
        fetch属性: 决定加载策略.使用什么类型的sql语句加载集合数据
            select(默认值): 单表查询加载
            join: 使用多表查询加载集合
            subselect:使用子查询加载集合
     -->
     <!-- batch-size: 抓取集合的数量为3.
            抓取客户的集合时,一次抓取几个客户的联系人集合.
      -->
        <set name="linkMens" batch-size="3"  >
            <key column="lkm_cust_id" ></key>
            <one-to-many class="LinkMan" />
        </set>
  • 关联属性策略
<!-- 
        fetch 决定加载的sql语句
            select: 使用单表查询
            join : 多表查询
        lazy  决定加载时机
            false: 立即加载
            proxy: 由customer的类级别加载策略决定.
         -->
  • 结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.
  • no-session问题解决: 扩大session的作用范围.


    image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容