亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

hibernate之hql查詢語言

來源:婷寶的大佬 發(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)載請附上博文鏈接!


標(biāo)簽: 數(shù)據(jù)庫
分享:
評論:
你還沒有登錄,請先