Hibernate Hql 查詢語言
阿新 • • 發佈:2018-12-18
1. 什麼是hql
HQL是Hibernate Query Language的縮寫
(HQL)是一種面向物件的查詢語言,類似於SQL,但不是去對錶和列進行操作,而是面向物件和它們的屬性.HQL查詢被Hibernate翻譯為傳統的SQL查詢從而對資料庫進行操作。
2. hql和sql區別/異同
- SQL
- 結構化查詢語言,表與列
- 不區分大小寫
- 可以通過空格與as給表和列起別名
- 支援?佔位符,從順序1開始
- HQL
- 面向物件的查詢語言,類與屬性
- 類和屬性區分大小寫,但關鍵字不區別大小寫
- 可以通過空格與as給類和屬性起別名
- 支援?佔位符,從下標0開始
- 支援:命名引數
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);
}
}