來源:婷寶的大佬 發(fā)布時(shí)間:2018-11-01 10:15:44 閱讀量:1085
HQL(Hibernate Query Language) 是面向?qū)ο蟮牟樵冋Z言, 它和 SQL 查詢語言有些相似. 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式.。它有如下功能:
在查詢語句中設(shè)定各種查詢條件;
支持投影查詢, 即僅檢索出對象的部分屬性;
支持分頁查詢;
支持連接查詢;
支持分組查詢, 允許使用 HAVING 和 GROUP BY 關(guān)鍵字;
提供內(nèi)置聚集函數(shù), 如 sum(), min() 和 max();
支持子查詢;
支持動態(tài)綁定參數(shù);
能夠調(diào)用 用戶定義的 SQL 函數(shù)或標(biāo)準(zhǔn)的 SQL 函數(shù)。
HQL 查詢包括以下步驟:
獲取Hibernate Session對象。
編寫HQL語句
以HQL語句作為參數(shù),調(diào)用Session的createQuery方法創(chuàng)建查詢對象。
如果HQL語句包含參數(shù),則調(diào)用Query的setXxx方法為參數(shù)賦值。
調(diào)用Query對象的list()或uniqueResult()方法返回查詢結(jié)果列表(持久化實(shí)體集)
HQL查詢實(shí)例:
private Session session;
private Transaction transaction;
@Before
public void before() {
session = SessionFactoryUtil.getSession();
transaction = session.beginTransaction();
}
@After
public void after() {
transaction.commit();
SessionFactoryUtil.closeSession();
}
/**
* 情況一:結(jié)果返回對象(用該對象的集合接收)
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:01:50
*/
@Test
public void test1() {
String hql="from Book";//Book是實(shí)體類名
Query query = session.createQuery(hql);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
查詢結(jié)果:
/**
* 情況二:查數(shù)據(jù)庫表中的一列(用該列的數(shù)據(jù)類型的集合接收)
* 數(shù)據(jù)庫:在數(shù)據(jù)庫表中查詢,是不區(qū)分大小寫
* hql:由于你查詢的是實(shí)體類的屬性,那么就區(qū)分大小寫了
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:27:18
*/
@Test
public void test2() {
String hql="select bookName from Book";//bookName是實(shí)體類里的屬性名
Query query = session.createQuery(hql);
List<String> list = query.list();
for (String string : list) {
System.out.println(string);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查詢結(jié)果:
/**
* 情況三:查數(shù)據(jù)庫表中的多列(用object數(shù)組集合接收,但推薦用List<Map>接收)
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:28:42
*/
@Test
public void test3() {
String hql="select bookName,bookId from Book";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] obj : list) {
System.out.println(Arrays.toString(obj));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
查詢結(jié)果:
/**
* 情況四:通過hibernate函數(shù)Map去處理(用List<Map>接收)
* 函數(shù)這個(gè)詞是源自于數(shù)據(jù)庫
* 函數(shù)不區(qū)分大小寫
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:37:30
*/
@Test
public void test4() {
String hql="select new map(bookName,bookId) from Book";
Query query = session.createQuery(hql);
List<Map> list = query.list();
for (Map obj : list) {
System.out.println(obj);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查詢結(jié)果:
/**
* 情況五:通過構(gòu)造方法進(jìn)行查詢(前提是該實(shí)體類里必須要有該構(gòu)造方法,否則會報(bào)錯(cuò))
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:40:06
*/
@Test
public void test5() {
String hql="select new Book(bookId,bookName) from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
for (Book obj : list) {
System.out.println(obj);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
查詢結(jié)果:
/**
* hibernate中的占位符問題
* hibernate5版本以后棄用“?”
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:42:46
*/
@Test
public void test6() {
String hql="from Book where bookId = :id";
Query query = session.createQuery(hql);
query.setParameter("id", 3);//用占位符傳一個(gè)參數(shù),查詢ID為3的書籍
Book book = (Book) query.getSingleResult();
System.out.println(book);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
查詢結(jié)果:
/**
* 用占位符傳多個(gè)參數(shù)(查ID為1和3的書籍)
* @author LJ
* @Date 2018年10月30日
* @Time 下午1:02:18
*/
@Test
public void test7() {
String hql="from Book where bookId in (:ids)";
Query query = session.createQuery(hql);
/*
* 寫法一
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
// query.setParameterList(“ids”, new Integer[] {1,3});
List ids=new ArrayList();
ids.add(1);
ids.add(3);
/*
* 寫法二
*/
query.setParameterList(“ids”, ids);
List list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
查詢結(jié)果:
/**
* 聯(lián)表查詢(查訂單和訂單項(xiàng))
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:51:15
*/
@Test
public void test8() {
//寫法一
1
2
3
4
5
6
7
8
9
// String hql=“select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId=oi.order.orderId”;
//寫法二
String hql=“select new map(o.orderNo,oi.productId) from Order o,OrderItem oi where o=oi.order”;
Query query = session.createQuery(hql);
List list = query.list();
for (Map map : list) {
System.out.println(map);
}
}
查詢結(jié)果:
/**
* 聚合函數(shù)(查書籍價(jià)格的平均數(shù))
* @author LJ
* @Date 2018年10月29日
* @Time 上午11:59:33
*/
@Test
public void test9() {
String hql="select avg(price) from Book";
Object singleResult = session.createQuery(hql).getSingleResult();
System.out.println(singleResult);
}
1
2
3
4
5
6
7
8
9
10
11
12
查詢結(jié)果:
/**
* 分頁
* @author LJ
* @Date 2018年10月29日
* @Time 下午12:00:55
*/
@Test
public void test10() {
String hql="from Book";
Query query = session.createQuery(hql);
int page=2;//查第二頁的數(shù)據(jù)
int ofset=2;//每頁顯示2條數(shù)據(jù)
query.setFirstResult((page-1)*ofset);//設(shè)置起始記錄下標(biāo)
query.setMaxResults(ofset);//設(shè)置返回的最大結(jié)果集
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
查詢結(jié)果:
總結(jié):HQL vs SQL
HQL 查詢語句是面向?qū)ο蟮? Hibernate 負(fù)責(zé)解析 HQL 查詢語句, 然后根據(jù)對象-關(guān)系映射文件中的映射信息, 把 HQL 查詢語句翻譯成相應(yīng)的 SQL 語句。HQL 查詢語句中的主體是域模型中的類及類的屬性。
SQL 查詢語句是與關(guān)系數(shù)據(jù)庫綁定在一起的。SQL 查詢語句中的主體是數(shù)據(jù)庫表及表的字段。
---------------------
作者:婷寶的大佬
來源:CSDN
原文:https://blog.csdn.net/qq_43195035/article/details/83579258
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!