1. 程式人生 > >hibernate的hql語句(一)

hibernate的hql語句(一)

1.什麼是hql

HQL是Hibernate Query Language的縮寫,提供更加豐富靈活、更為強大的查詢能力;HQL更接近SQL語句查詢語法。

 

2. hql和sql區別/異同

HQL SQL
操作的是類名/屬性   操作的是表名/列名
語句區分大小寫,關鍵字不區分大小寫  語句不區分大小寫
?,從下標0開始計算位置(hibernate5之後不支援) ?,從順序1開始計算位置
:命名引數   不支援:命名引數
 面向物件的查詢語言    面向結構查詢語言

3. 處理返回的結果集

3.1返回單個物件

/**
     * hql語句結果集處理情況1
     * 返回單個物件
     */
    public static void test1(){
   Session session = SessionFactoryUtils.openSession();
   Transaction transaction = session.beginTransaction();
        String hql="from Student where sid=1";
        Query query = session.createQuery(hql);
        Object obj = query.getSingleResult();
        System.out.println(obj.getClass().getName());
        System.out.println(obj);
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

結果:

3.1.2返回多個物件

/**
     * hql語句結果集處理情況1
     * 返回多個物件  注意資料庫欄位不能為null
     */
    public static void test2(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="from Student";
        Query query = session.createQuery(hql);
        List list=query.list();
        for (Object o : list) {
            System.out.println(o);
        }
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

 結果:

3.2返回字串

 

/**
     * hql語句結果集處理情況2
     * 返回字串
     */
    public static void test3(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="select sname from Student where sid=1";
        Query query = session.createQuery(hql);
        Object obj=query.getSingleResult();
        System.out.println(obj);
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

結果:

3.3返回陣列

/**
     * hql語句結果集處理情況3
     * 返回陣列
     */
    public static void test4(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="select sid,sname,version from Student where sid=1";
        Query query = session.createQuery(hql);
        Object obj=query.getSingleResult();
        System.out.println(Arrays.toString((Object[])obj));
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

 結果:

3.4返回Map

 /**
     * hql語句結果集處理情況4
     * 返回Map
     */
    public static void test5(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="select new map(sid as sid,sname as sname,version as version) from Student where sid=1";
        Query query = session.createQuery(hql);
        Object obj=query.getSingleResult();
        System.out.println(obj);
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

結果:

3.5查詢多列返回物件(注意物件的構造方法

 

 /**
     * hql語句結果集處理情況5
     * 查詢多列返回物件
     */
    public static void test6(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="select new Student (sid,sname)from Student where sid=1";
        Query query = session.createQuery(hql);
        Object obj=query.getSingleResult();
        System.out.println(obj.getClass().getName());
        System.out.println(obj);
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

結果:

4. hql中使用佔位符

 4.1 ?佔位符

從下標0開始計算位置hibernate5之後不再支援?佔位符所以不為大家介紹了

4.2 :命名引數

/**
     * hql命名引數
     */
    public static void test7(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="from Student where sid in :ids";
        Query query = session.createQuery(hql);
        //這裡使用 query.setParameter(0,1)報錯
      // query.setParameter("id",1);//這個是傳單個引數
        // 如果使用in的話
        List ids=new ArrayList();
        ids.add(1);
        ids.add(2);
        query.setParameterList("ids",ids);
        Object obj = query.getSingleResult();
        System.out.println(obj.getClass().getName());
        System.out.println(obj);
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

5.連線查詢

public static void test8(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
       String hql="select new map(oi.order_item_id,o.order_id)  from  Order o,OrderItem oi where o.order_id=oi.oid ";
        Query query = session.createQuery(hql);
        List list=query.list();
        for (Object o : list) {
            System.out.println(o);
        }
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

結果: 

 

6. 聚合函式

這裡就給大家使用一個count()函式其餘的sum,avg,min,max用法都一樣

/**
     * 聚合函式
     */
    public static  void test9(){
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql="select count(sid)from Student ";
        Query query = session.createQuery(hql);
        Object singleResult = query.getSingleResult();
        System.out.println(singleResult);
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }

7.hql分頁

 

 /**
     * hql分頁
     * 查詢第二頁每頁三條
     */
    public static void test10() {
        Session session = SessionFactoryUtils.openSession();
        Transaction transaction = session.beginTransaction();
        String hql = "from Book ";
        Query query = session.createQuery(hql);
        int page = 2;
        int offeset = 3;
        query.setFirstResult(page * offeset);
        query.setMaxResults((page - 1) * offeset);
        List list = query.list();
        for (Object o : list) {
            System.out.println(o);
        }
        transaction.commit();
        SessionFactoryUtils.closeSession();
    }