1. 程式人生 > >hql語言的使用及與sql語言的區別

hql語言的使用及與sql語言的區別

1. 什麼是hql
   HQL是Hibernate Query Language的縮寫

   查全部

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

   注1:QuerySyntaxException:book is not mapped

3. 處理返回的結果集
  3.1 單個物件
      select沒有逗號
  3.2 Object[]
      b.bookId, b.bookName
  3.3 Map
      new Map(b.bookId as bid, b.bookName as bname)
  3.4 new 構造方法(attr1,attr2)
      new Book(b.bookId, b.price)


4. hql中使用佔位符
  4.1 ?佔位符
      從下標0開始計算位置
      hibernate5之後不再支援?佔位符

  4.2 :命名引數


5. 連線查詢

6. 聚合函式
   sum
   avg
   max
   min
   count

7. hql分頁
   int page = 2;// 頁碼:page
   int row = 10;// 每頁行數:rows
   query.setFirstResult((page - 1) * row);// 設定起始記錄下標
   query.setMaxResults(row);// 設定返回的最大結果集     

 

----------------------------------------------------------------------------------------------------------------------

一些測試的例項

package com.zking.seven.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mysql.cj.x.protobuf.MysqlxDatatypes.Array;
import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtils;

public class HqlTest {
    private Session session;
    private Transaction transaction;

    // 測試方法前回呼叫的方法
    @Before
    public void before() {
        session = SessionFactoryUtils.getSession();
        transaction = session.beginTransaction();
    }

    
    /**
     * 結果處理情況一:Book
     *         直接利用物件進行資料接收
     *        jdbc:操作資料庫的表
     *
     *         hql:操作實體類
     * 
     */
    @Test
    public void testList1() {
//        Query  相當於   prepareStateent
        Query query = session.createQuery("from Book");
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }
    
    /**
     * 情況二:String
     *     查一列
     *     jdbc:查的是表中某列,列名不區分大小寫
     *     hql:查的是實體類的某一屬性,嚴格區分大小寫
     */
    @Test
    public void testList2() {
        String hql = "select bookName from Book";
        List<String> list = session.createQuery(hql).list();
        for (String string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * 情況三:Object[]
     *     查多列
     * 
     */
    @Test
    public void testList3() {
        String hql = "select bookId,bookName from Book";
        List<Object[]> list = session.createQuery(hql).list();
        for (Object[] string : list) {
            System.out.println(Arrays.toString(string));
        }
    }
    
    /**
     * 情況四:利用hibernate內建函式進行處理
     *         map不區分大小寫,是hibernate內建的函式
     */
    @Test
    public void testList4() {
        String hql = "select new map(bookId,bookName) from Book";
        List<Map> list = session.createQuery(hql).list();
        for (Map string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * 情況五:利用構造方法處理結果
     *         先提供這些引數的構造方法
     */
    @Test
    public void testList5() {
        String hql = "select new Book(bookId,bookName) from Book";
        List<Book> list = session.createQuery(hql).list();
        for (Book string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * hql中使用佔位符
     *         hql:from Book where BookId = ?/:xxx/:BookId
     *         hibernate5之後不再支援?佔位符
     * 
     */
    @Test
    public void testList6() {
//        String hql = "from Book where bookId = :BookId";
//        Query query = session.createQuery(hql);
//        query.setParameter("BookId", 2);
//        //查單個
//        Book o = (Book) query.getSingleResult();
//        System.out.println(o);
        
        
//        指定id的書籍
//        String hql = "from Book where price > :min and price < :max";
//        Query query = session.createQuery(hql);
//        query.setParameter("min",10f);
//        query.setParameter("max", 15f);
//        List<Book> list = query.list();
//        for (Book book : list) {
//            System.out.println(book);
//        }
        
        //指定愛好的書籍
        String hql = "from Book where bookId in (:bookIds)";
        Query query = session.createQuery(hql);
        List<Integer> l = new ArrayList<>();
        l.add(1);
        l.add(2);
        l.add(3);
        query.setParameterList("bookIds", l);
//        query.setParameterList("bookIds", new Integer[]    {2,4,5,});
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }
    
    /**
     * 聯表查詢
     *     用
     *     hql: select * from Order o,OrderItem oi 
     *         where o.OrderId = oi.order.orderId
     *     
     */
    @Test
    public void testList7() {
        //通過物件的屬性或者直接通過物件來關聯
//        String hql = "select o.orderNo,oi.quantity from Order o,OrderItem oi where o.orderId = oi.order.orderId";
        String  hql = "select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order";
        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    }
    
    /**
     * 聚合函式
     */
    @Test
    public void testList8() {
        String hql = "select count(*) from Book";
        Query query = session.createQuery(hql);
        Object o = query.getSingleResult();
        System.out.println(o);
    }
    
    /**
     * hibernate中的分頁
     *         select * from 
     * 需要查詢不同的資料庫需要在主配置檔案中修改配置檔案
     */
    @Test
    public void testList9() {
        String hql = " from Book where bookName like :bname";
        int rows = 3;
        int page = 2;
        Query query = session.createQuery(hql);
        query.setParameter("bname", "%不%");
        //設定查詢的起始位置
        query.setFirstResult((page-1)*rows);
        //設定每頁的資料量
        query.setMaxResults(rows);
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
        
    }

    // 執行完測試方法會呼叫
    @After
    public void after() {
        transaction.commit();
        session.close();
    }
}