HQL單表查詢 ---- Hibernate之查詢語句


敘:在hibernate框架中查詢數據庫的語句主要分為HQL、QBC、SQL這三種,各有各的特點,使用的情況也不盡相同,之前關於HQL查詢方式的也有一些學習,但是並不全面,今天本章節輕風就HQL(Hibernate Query Language)查詢語句進行了詳細的學習;


HQL查詢數據

本章節主要學習的是HQL查詢方式的單表查詢,多表查詢在下一章節學習記錄;

HQL介紹

HQL(Hibernate Query Language):是hibernate的數據查詢方式,HQL是針對持久化對象的,它用來取得對象而不進行update、delete和insert等更新操作,是一種完全面向對象的查詢方式,並且具備繼承、多態和關聯等特性,因此在里面的查詢語句都是針對實體對象以及實體對象中的屬性的,不要搞混了;

幾種查詢方式

1. 簡單查詢
此查詢是hql的基本查詢方式,沒有任何修飾,查詢所有一張表的所有數據
代碼如下:

@Test
    /*
     * HQL的基本查詢
     */
    public void demo1() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        // String sql1 = "from com.java.domain.Customer";//全類名書寫
        String sql = "from Customer";// 簡單書寫
        Query cust = session.createQuery(sql);
        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

HQL數據查詢是一面向對象的形式,因此,sql=”from Customer”;這句中的Customer是實體對象的名稱,而非數據庫表的名表名,關於實體類名有兩種書寫方式,一種是全類名,即:從src到類名,這種寫法是為了防止碰到相同類名的文件(一般情況下沒必要這么寫);第二種是直接寫類名的簡單書寫,這種是最常用的;


2. 排序查詢
排序查詢和基本查詢差別不大,主要是在查詢的類名后邊添加order by+排序依據的列名+排序方式,與sql語句的類似(asc是升序方式,desc是降序方式);

@Test
    /*
     *  排序查詢
     */
    public void demo2() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql = "from Customer order by cust_id desc";// asc:升序    desc:降序
        Query cust = session.createQuery(sql);
        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

3. 條件查詢
與sql語句類似,where后邊加上根據哪個列進行條件查詢,並通過占位符來進行查詢;
占位符存在兩種,一種是直接用問號,第二種是起代號,注意,起代號的方式需要在代號前加冒號;兩種操作如下所示:

@Test
    /*
     * 條件查詢
     */
    public void demo3() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        //String sql = "from Customer where cust_id=?";//通過問占位
        String sql1 = "from Customer where cust_id=:id ";//通過“代號”占位
        Query cust = session.createQuery(sql1);
        //cust.setParameter(0, 2l);//通過問號占位的從0開始排序
        cust.setParameter("id", 2l);
        List list = cust.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

問號占位符需要在setparameter中從0開始排序,
代號占位符需要在setparameter中先寫代號,再寫條件查詢的條件值;


4. 分頁查詢
分頁查詢只需要兩個關鍵字,setFirstResults()和setMaxresults(),第一個是起始索引值,第二個每頁最大顯示數據條數; (起始索引值 = (當前頁數-1)* 每頁顯示條數)

@Test
    /*
     * 分頁查詢
     */
    public void demo4() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql = "from Customer";
        Query cust = session.createQuery(sql);
        //limit ?,?    索引起始 = (當前頁數-1)* 每頁要顯示的數據條數
        cust.setFirstResult(2);//起始索引
        cust.setMaxResults(2);//每頁顯示條數

        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

5. 統計查詢
統計查詢重點在於關鍵字,這個關鍵字和排序查詢一樣,都在查詢語句中,和分頁查詢的關鍵字不一樣,分頁查詢的關鍵字是在代碼中,不是在查詢語句中;
主要的幾個關鍵字:

  • count 統計
  • sum 求和
  • avg 平均數
  • max(min)最大值(最小值)

代碼:

@Test
    /* 
     *統計查詢
     */
    public void demo5() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql_count = "select count(*) from Customer";
        String sql_sum = "select sum(cust_id) from Customer";
        String sql_avg = "select avg(cust_id) from Customer";//獲得的是double類型的返回值
        String sql_max = "select max(cust_id) from Customer";
        String sql_min = "select min(cust_id) from Customer";

        Query cust = session.createQuery(sql_avg);
        Number uniqueResult = (Number) cust.uniqueResult();
        System.out.println(uniqueResult);

        bt.commit();
        session.close();
    }

在關鍵字后的括號內填入根據實體對象的那個屬性進行統計查詢,不是根據數據庫表的列名
接收轉化的關鍵字需要注意,使用uniqueresult方法進行接收,Number類進行存放,Number類型的是封裝的接收類,里面封裝了各種數據類型的接收方法,直接使用就OK了。


6. 投影查詢
投影查詢就是查詢一個表中某幾個自己需要的字段數據,這個查詢的好處就是能夠簡明快速的查詢到自己想要的數據,不會浪費內存等資源;
在返回值方面需要注意,返回值是一個list類型的;

@Test
    /*
     * 投影查詢
     * 
     */
    public void demo6() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql1 = "select cust_name from Customer";
        String sql2 = "select cust_id,cust_name from Customer";//這種顯示效果不佳,一般不使用
        String sql3 = "select new Customer(cust_id,cust_name) from Customer";//需要在對應的Customer實體類中構造方法,創建無參構造
        Query cust = session.createQuery(sql3);

        List list = cust.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

查詢單個字段屬性時,直接將表中字段名對應的實體類的屬性名寫上即可,如果是查詢多個而非表中所有時,直接以:
Select new 對象名(屬性名1,屬性名2,…) from 類名;
注意:此中的對象名的對象是需要在實體類名的類中進行構造的,並且要類中有對應的無參構造,以上面的sql3的查詢語句為例,其在Customer類中的對象的構造以及無參構造如下所示:
無參構造截圖 這個例子中主查詢類是Customer,所以其返回值的范型是Customer,運行的結果如下圖所示:
運行的結果截圖

從中可以看出,數據變成了一條一條的被放在以一個數據集合中;


pass:本章及學習記錄了HQL查詢方式的單表查詢方式,下章才會把學習的HQL的多表查詢方式上傳上來,有需要的可以看看下一章
pass:pass:筆記是根據個人理解寫出來的,有可能有理解不到位的地方,希望各位發現后可以告訴我,相互進步~


《本章完》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM