Hibernate--HQL基礎語法

BtWangZhi發表於2017-09-08

1 建立表

    @Test
    public void testCreateDB(){
        //3.x
        //Configuration cfg = new AnnotationConfiguration().configure();
        Configuration cfg = new Configuration().configure();
        SchemaExport se = new SchemaExport(cfg);
        se.create(true, true);
    }

2 查詢
2.1 根據單個屬性

    public void testQuery1(){
        //查詢所有書名
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //Book 大寫 表示的是  cn.siggy.pojo.Book類
        //name表示的 Book類中的屬性名
        String hql="select name from Book";
        Query query = session.createQuery(hql);
        //list()方法返回查詢結果
        //返回結果的型別 是根據查詢的列決定的
        List<String> list = query.list();
        for(String bookname:list){
            System.out.println(bookname);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

2.2 查詢多個屬性

    public void testQuery2(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //Book 大寫 表示的是  cn.siggy.pojo.Book類
        //name表示的 Book類中的屬性名
        //list()方法返回查詢結果
        //查詢多個列時  返回結果是陣列集合 陣列中元素的型別 是由查詢列來決定
        List<Object[]> list = session.createQuery("select name,price from Book").list();
        for(Object[] objs:list){
            System.out.println(objs[0]+"--"+objs[1]);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

查詢多個列時 將查詢結果封裝為物件集合

    public void testQuery3(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //Book 大寫 表示的是  cn.siggy.pojo.Book類
        //name表示的 Book類中的屬性名
        //list()方法返回查詢結果
        //查詢多個列時  返回結果是陣列集合 陣列中元素的型別 是由查詢列來決定
        List<Book> list = session.createQuery("select new Book(name,price) from Book").list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

3 別名的使用

    public void testQuery4(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //Book 大寫 表示的是  cn.siggy.pojo.Book類
        //name表示的 Book類中的屬性名
        //list()方法返回查詢結果
        //查詢多個列時  返回結果是陣列集合 陣列中元素的型別 是由查詢列來決定
        List<Book> list = session.createQuery("select new Book(b.name,b.price) from Book as b").list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

4 查詢所有列

    public void testQuery5(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list = session.createQuery("from Book").list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

查詢所有列2 不能使用* 需要使用別名

    public void testQuery6(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list = session.createQuery("select b from Book b").list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

5 條件查詢 佔位符 從0開始

    public void testQuery7(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list = session.createQuery("from Book b where id<?")
                        .setInteger(0, 4)
                        .list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

條件查詢 佔位符 從0開始,setParameter不用理會引數型別

    public void testQuery8(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list = session.createQuery("from Book b where id<?")
                        .setParameter(0, 4)
                        .list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

條件查詢 命名查詢–設定條件引數的名稱 以冒號開頭後更名稱 設定引數時 只需指定名

    public void testQuery9(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list = session.createQuery("from Book b where id<:id")
                        .setParameter("id", 4)
                        .list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

6 分頁查詢

    public void testQuery10(){
        //查詢所有書 的名稱和價格
        //建立Query物件
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list = session.createQuery("from Book b")
                        .setFirstResult(3)//開始顯示的記錄下標(currentPage-1)*pageSize
                        .setMaxResults(3)//設定每頁記錄數pageSize
                        .list();
        session.createSQLQuery("").setFirstResult(1).setMaxResults(0);
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

7 聚合函式–統計查詢

    public void testQuery11(){
        //查詢圖書總數
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //int,long
        Number count = (Number)session.createQuery("select max(b.price) from Book b")
                        .uniqueResult();
        System.out.println("總數:"+count.byteValue());
        tx.commit();
        HibernateUtil.closeSession();
    }

8 分組查詢

    public void testQuery12(){
        //查詢圖書總數
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //int,long
        List<Object[]> list = session.createQuery("select b.category.name,count(b.id) from Book b group by b.category.name")
                        .list();
        for(Object[] objs:list){
            System.out.println(objs[0]+"--"+objs[1]);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

9 排序

    public void testQuery13(){
        //查詢圖書總數
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //int,long
        List<Book> list = session.createQuery("from Book order by price desc")
                        .list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

10 連線查詢

    public void testQuery14(){
        //查詢 "仙俠"的書籍資訊
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        String hql="from Book b where b.category.name=:name";
        hql="select b from Book b join b.category c where c.name=:name";
        hql="select b from Book b inner join b.category c where c.name=:name";
        List<Book> list = session.createQuery(hql)
                        .setString("name", "仙俠")
                        .list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

11 左外連結

    public void testQuery15(){
        //查詢 "仙俠"的書籍資訊
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        String hql="select c.name,b.name from Category c left outer join c.books b";
        List<Object[]> list = session.createQuery(hql)
                        .list();
        for(Object[] objs:list){
            System.out.println(objs[0]+"----"+objs[1]);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

12 過濾器的使用

    /* 1、定義過濾器
     * 2、使用:加條件
     * 3、在查詢時候 使得過濾器生效
     * */
    public void testQuery16(){
        //查詢 "仙俠"的書籍資訊
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //啟用過濾器
        session.enableFilter("bf").setParameter("id", 4);
        List<Book> list =session.createQuery("from Book").list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }

13 命名查詢NamedQuery

    public void testQuery17(){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        List<Book> list =session.getNamedQuery("getByCategoryId")
                        .setInteger("id", 3)
                        .list();
        for(Book b:list){
            System.out.println(b);
        }
        tx.commit();
        HibernateUtil.closeSession();
    }