1. 程式人生 > >Hibernate Hql 查詢語言

Hibernate Hql 查詢語言

1. 什麼是hql

HQL是Hibernate Query Language的縮寫

(HQL)是一種面向物件的查詢語言,類似於SQL,但不是去對錶和列進行操作,而是面向物件和它們的屬性.HQL查詢被Hibernate翻譯為傳統的SQL查詢從而對資料庫進行操作。

2. hql和sql區別/異同

  • SQL
  1. 結構化查詢語言,表與列
  2. 不區分大小寫
  3. 可以通過空格與as給表和列起別名
  4. 支援?佔位符,從順序1開始
  • HQL
  1. 面向物件的查詢語言,類與屬性
  2. 類和屬性區分大小寫,但關鍵字不區別大小寫
  3. 可以通過空格與as給類和屬性起別名
  4. 支援?佔位符,從下標0開始
  5. 支援:命名引數

HQL常見錯誤

Query介面常用方法 單個引數 setXXX(int,XXX); setXXX(String,XXX); setParameter(int,Object); setParameter(String,Object); 一組引數 setParameterList(String,Object[]);//視窗中最少要儲存一個值 setParameterList(String,Collection);

注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)
	private Session session;
	private Transaction transaction;
	
	@Before
	public void before() {
		session = SessionFactoryUtils.getSession();
		transaction = session.beginTransaction();
	}
	
	@After
	public void after() {
		transaction.commit();
		session.close();
	}
	
	/*
	 * 結果處理情況一
	 * 		直接利用物件進行接收
	 * jdbc:操作資料庫
	 * 		select * from t_hirbernate_book
	 * 		list<Book> list=this.BookDao.executeQuery(sql,pageBean pageBean,Book book)
	 * hql:操作實體類
	 * 		select * from t_hirbernate_book
	 * 		resultest
	 * 		2	紅樓夢	50
			3	水滸	50
			4	三國演義	50
			5	啊啊啊啊啊啊啊啊啊	123
			Vlass clz=Book.class;
			while(rs.nest){
				Book b=clz.newInstance();
				Filed[] fileds=clz.getDecarldFiles();
				for(Field f:Fields){
					f.set(b,rs.getObject(1))
				}
				list.add(b);
			}

	 */
	@Test
	public void testList1() {
		String hql="from Book";
//		Query-->preparestatement
		Query query = session.createQuery(hql);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}
	
	/**
	 * 結果處理情況二
	 *  	查一列
	 *  jdbc:查的是表中的某一列,列名不區分大小寫
	 *  hql:查的是實體類的某一屬性,嚴格區分大小寫
	 */
	@Test
	public void testList2() {
		String hql="select bookName from Book";
		List<String> list = session.createQuery(hql).list();
		for (String bname : list) {
			System.out.println(bname);
		}
	}
	
	
	/**
	 * 結果處理情況三:通過Object[]接收
	 * Class
	 * Book
	 * mvc->EntityBaseDao.insert(sql,keys,Book book)
	 * 	表 			8
	 * 	實體類		8
	 * 
	 * Book book傳值6個
	 * keys new String[6]
	 * 
	 * map
	 */
	@Test
	public void testList3() {
		String hql="select bookId,bookName from Book";
		List<Object[]> list = session.createQuery(hql).list();
		for (Object[] book : list) {
			System.out.println(Arrays.toString(book));
		}
	}
	
	/**
	 * 結果處理情況四:利用hibernate內建的函式進行結果處理
	 * 在這裡map不是介面,是函式,不區分大小寫
	 */
	@Test
	public void testList4() {
		String hql="select new mAP(bookId,bookName) from Book";
		List<Map> list = session.createQuery(hql).list();
		for (Map book : list) {
			System.out.println(book);
		}
	}
	
	/**
	 * 結果處理情況五:利用構造方法進行結果處理
	 * 注意要定義一個構造方法
	 * 	1,當你給某一個類提供有參構造器,順便加上無參構造器
	 * 	2,構造方法賦值的原理
	 * 		2	紅樓夢
			3	水滸
			resultest
			Class clz=Book.class
			construct c=clz.getDecarldconstruct()
			獲取到有參構造器中的引數
			Filed[] fileds=clz.getDecarldFiles();
			for(Field f:Fields){
				f.set(b,rs.getObject(1))
			}
			list.add(c.newInstance(?,?));
	 */
	@Test
	public void testList5() {
		String hql="select new Book(bookId,bookName) from Book";
		List<Book> list = session.createQuery(hql).list();
		for (Book book : list) {
			System.out.println(book);
		}
	}

4. hql中使用佔位符

4.1 ?佔位符 從下標0開始計算位置 hibernate5之後不再支援?佔位符

4.2 :命名引數

@Test
	public void testList6() {
		/*String hql="from Book where bookId= :bookId";
		Query query = session.createQuery(hql);
		query.setParameter("bookId", 2);
		Book book = (Book) query.getSingleResult();
		System.out.println(book);*/
		
		/*String hql="from Book where price > :min and price < :max";
		Query query = session.createQuery(hql);
		query.setParameter("min", 49f);
		query.setParameter("max", 51f);
		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> params=new ArrayList<>();
		params.add(1);
		params.add(3);
		params.add(4);
		query.setParameterList("bookIds", params);
		//query.setParameterList("bookIds", new Integer[] {2,3,4});
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}

5. 連線查詢

/**
	 * 連表查詢
	 *   jdbc:select * from t_hibernate_order o,t_hibernate_orderitem oi where o.orderId=oi.oid
	 *   hql:select * from Order o,OrderItem oi where o.orderId=oi.order.orderId
	 */
	@Test
	public void testList7() {
//		String hql="select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId=oi.order.orderId";
		String hql="select o.orderNo,oi.productId 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));
		}
	}

6. 聚合函式

sum avg max min count

應為程式碼都差不多,就舉例一個用於分頁的聚合函式
/**
	 * 聚合函式
	 */
	@Test
	public void testList8() {
		String hql="select count(*) from Book";
		Object result = session.createQuery(hql).getSingleResult();
		System.out.println(result);
	}

7. hql分頁

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

/**
	 * hibernate中的分頁
	 * 一頁3條資料
	 * 當前查第二頁資料
	 * jddbc:	select * from t_hibernate_book where book_name like '?';
	 * 			sql+=limit ?,?
	 * 1,起始位置		(2-1)*3
	 * 2,偏移量  	    3
	 */
	@Test
	public void testList9() {
		String hql="from Book where bookName like :bookName";
		int rows=2;
		int page=1;
		Query query = session.createQuery(hql);
		query.setParameter("bookName", "紅樓夢");
		query.setFirstResult((page-1)*rows);
		query.setMaxResults(rows);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}