Hibernate中Hql查詢

?

這篇隨筆將會記錄hql的常用的查詢語句,為日后查看提供便利。

在這里通過定義了三個類,Special、Classroom、Student來做測試,Special與Classroom是一對多,Classroom與Student是一對多的關系,這里僅僅貼出這三個bean的屬性代碼:

Special類:

復制代碼
復制代碼
public class Special
{private int id;private String name;private String type;private Set<Classroom> rooms;..........
}
復制代碼
復制代碼

Classroom類:

復制代碼
復制代碼
public class Classroom
{private int id;private String name;private Special special;private Set<Student> students;............
}
復制代碼
復制代碼

Student類:

復制代碼
復制代碼
public class Student
{private int id;private String name;private String sex;private Classroom room;..........
}
復制代碼
復制代碼

1.最簡單的查詢

List<Special> specials = (List<Special>)session.createQuery("select spe from Special spe").list();

這是hql最基本的查詢語句了,作用就是查出所有的Special對象放到一個List當中

2.基于 ? 的參數化形式

復制代碼
復制代碼
       /*** 查詢中使用?,通過setParameter的方式可以防止sql注入* jdbc的setParameter的下標從1開始,hql的下標從0開始*/List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like ?").setParameter(0, "%劉%").list();
復制代碼
復制代碼

?

在hql中同樣支持基于 ? 的參數化形式查詢,注意:在jdbc中,setParameter的下標是從1開始的,而hibernate的setParameter的下標是從0開始的。

3.基于 :xx 的別名的方式設置參數

復制代碼
       /*** 在hql中可以使用別名的方式來查詢,格式是 :xxx 通過setParameter來設置別名*/List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like :name and sex like :sex").setParameter("name", "%王%").setParameter("sex", "%男%").list();
復制代碼

4.如果返回的值只有一個,可以使用uniqueResult方法

復制代碼
復制代碼
       /*** 如果得到的值只有一個,則可以使用uniqueResult方法*/Long stu = (Long)session.createQuery("select count(*) from Student stu where name like :name and sex like :sex").setParameter("name", "%王%").setParameter("sex", "%男%").uniqueResult();/*** 如果得到的值只有一個,則可以使用uniqueResult方法*/Student stu = (Student)session.createQuery("select stu from Student stu where id = ?").setParameter(0, 1).uniqueResult();
復制代碼
復制代碼

5.基于投影的查詢

復制代碼
復制代碼
       /*** 基于投影的查詢,如果返回多個值,這些值都是保存在一個object[]數組當中*/List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.name, stu.sex from Student stu where name like 
                            :name and sex like :sex").setParameter("name", "%張%").setParameter("sex", "%男%").list();
復制代碼
復制代碼

6.基于導航對象的查詢

復制代碼
復制代碼
       /*** 如果對象中有導航對象,可以直接通過對象導航查詢*/List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex").setParameter("room", "%計算機應用%").setParameter("sex", "%女%").list();
復制代碼
復制代碼

注意:若直接通過導航對象來查詢時,其實際是使用cross join(笛卡兒積)來進行連接查詢,這樣做性能很差,不建議使用

7.使用 in 進行列表查詢

復制代碼
復制代碼
       /*** 可以使用in設置基于列表的查詢,使用in查詢時需要使用別名來進行參數設置,* 通過setParameterList方法即可設置,在使用別名和?的hql語句查詢時,?形式的查詢必須放在別名前面*/
//            List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where sex like ? and stu.room.id in (:room)")
//                                                .setParameter(0, "%女%").setParameterList("room", new Integer[]{1, 2})
//                                                .list();List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.id in (:room) and stu.sex like :sex").setParameterList("room", new Integer[]{1, 2}).setParameter("sex", "%女%").list();
復制代碼
復制代碼

在使用 in 進行列表查詢時,這個時候要通過 setParameterList() 方法來設置我們的參數,注意:如果一個參數通過別名來傳入,一個是通過 ? 的方式來傳入的話,那么通過別名的hql語句以及參數設置語句要放在 ? 的后面,不然hibernate會報錯。如果都是使用 別名 來設置參數,則無先后順序

8.分頁查詢

復制代碼
復制代碼
       /*** 通過setFirstResult(0).setMaxResults(10)可以設置分頁查詢,相當于offset和pagesize*/List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex").setParameter("room", "%計算機應用%").setParameter("sex", "%女%").setFirstResult(0).setMaxResults(10).list();
復制代碼
復制代碼

9.內連接查詢

復制代碼
       /***    使用對象的導航查詢可以完成連接查詢,但是使用的是Cross Join(笛卡兒積),效率不高,所以建議使用join來查詢*/List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu join stu.room room where room.id=2").list();
復制代碼

在hql中使用連接查詢的語句與我們的sql進行連接查詢的語句是有區別的:

hql:    select stu from Student stu join stu.room roomsql:    select t.* from Student t join Classroom c on t.cid=c.id

10.左外連和右外連查詢

復制代碼
       /***    左外連和右外連其實是相對的,left join 就是以左邊的表為基準, right join 就是以右邊的表為基準*/List<Object[]> stus = (List<Object[]>)session.createQuery("select room.name, count(stu.room.id) from Student stu right join stu.room room group by room.id").list();
復制代碼

11.創建DTO類,將查詢出來的多個字段可以存放到DTO對象中去

復制代碼
復制代碼
       /***    當如果我們查詢出多個字段的話,通常會創建一個DTO對象,用來存儲我們查詢出來的數據,通過 new XXX() 這樣的方式*    前提是XXX這個類里面必須要有接受這些字段的構造方法才行,而且必須要使用類的全名*/
//            List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.id,stu.name,stu.sex,room.name,special.name from Student stu left join stu.room room left join room.special special")
//                                                .list();
//            for(Object[] obj : stus)
//            {
//                System.out.println(obj[0] + ", " + obj[1] + ", " + obj[2] + ", " + obj[3] + ", " + obj[4]);
//            }

List<StudentDTO> stus = (List<StudentDTO>)session.createQuery("select new com.xiaoluo.bean.StudentDTO(stu.id, stu.name, stu.sex, room.name, special.name) from Student stu left join stu.room room left join room.special special")
                             .list();
復制代碼
復制代碼

12.group having字句

復制代碼
/*** 在hql中不能通過給查詢出來的字段設置別名,別名只能設置在from 后面*/List<Object[]> stus = (List<Object[]>)session.createQuery("select special.name, count(stu.room.special.id) from Student stu right join stu.room.special special group by special.id having count(stu.room.special.id)>150").list();  // 查詢出人數大于150個人的專業
復制代碼
復制代碼
       
       //  查詢出每個專業中男生與女生的個數
       List<Object[]> stus = (List<Object[]>)session.createQuery("select special.name, stu.sex, count(stu.room.special.id) from Student stu right join stu.room.special special group by special.id,stu.sex").list();
復制代碼

轉載于:https://www.cnblogs.com/hq233/p/6525199.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371367.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java代碼質量工具–概述

最近&#xff0c;我有機會在本地IT社區聚會上介紹了該主題。 這是基本演示&#xff1a; Java代碼質量工具 以及更有意義的思維導圖&#xff1a; 但是&#xff0c;我認為我需要更深入地探討這一主題。 這篇博客文章應該像是在此方向上進行進一步調查的起點。 1. CodePro Anal…

利用yum升級Centos6的gcc版本,使其支持C++11

下面的可以在centos6下工作&#xff0c;centos7下有問題。可能是因為centos下的scl我是拷貝的文件&#xff0c;沒有完全驗證centos6下肯定沒問題。 https://my.oschina.net/u/583362/blog/682123 和https://www.quyu.net/info/876.html 拷貝其關鍵內容就是&#xff1a; 1.使用 …

cuda版本查看_ubuntu安裝CUDA

0 寫在前面安裝環境&#xff1a;ubuntu18.04以及GTX1050Ti筆記本為什么要安裝CUDA&#xff1f; 參考百科&#xff0c;CUDA是英偉達推出的集成技術&#xff0c;通過該技術可利用GeForce 8 以后的GPU或者較新的Quadro GPU進行計算。例如典型的tensorflow-GPU和pyCUDA安裝之前都要…

HTML 標簽列表(功能排序) HTML 參考手冊- (HTML5 標準)

HTML 標簽列表&#xff08;功能排序&#xff09; HTML 參考手冊- (HTML5 標準) 功能排序 New : HTML5 新標簽 標簽描述基礎 <!DOCTYPE> 定義文檔類型。<html>定義一個 HTML 文檔<title>為文檔定義一個標題<body>定義文檔的主體<h1> to <h6>…

idea新建scala文件_IDEA maven項目中新建.scala文件

本文首發于我的博客[IDEA maven項目中新建.scala文件]分為三步第一步、IDEA中安裝scala插件1、搜索安裝File-Sittings-Plugins-搜索安裝scala2、安裝完成重啟安裝完成之后點擊重啟idea第二步、下載、安裝、配置Scala1、下載安裝Scala SDK本體搜索引擎搜索Scala SDK或者點我去Sc…

Linux中執行shell腳本的4種方法總結

文章來源&#xff1a;http://www.jb51.net/article/53924.htm 這篇文章主要介紹了Linux中執行shell腳本的4種方法總結,即在Linux中運行shell腳本的4種方法,需要的朋友可以參考下 bash shell 腳本的方法有多種&#xff0c;現在作個小結。假設我們編寫好的shell腳本的文件名為hel…

Log4j線程死鎖–案例研究

此案例研究描述了影響Weblogic Portal 10.0生產環境的Apache Log4j線程爭用問題的完整根本原因分析和解決方案。 它還將說明在開發和支持Java EE應用程序時適當的Java類加載器知識的重要性。 本文也是您提高線程轉儲分析技能和了解線程競爭條件的另一個機會。 環境規格 Java …

代碼實現:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字

import java.util.Scanner;/*題目&#xff1a;求saaaaaaaaaaaa...a的值&#xff0c;其中a是一個數字。例如222222222222222(此時共有5個數相加)&#xff0c;幾個數相加有鍵盤控制。 程序分析&#xff1a;關鍵是計算出每一項的值。*/public class Test08 {public static void ma…

堆棧跟蹤從何而來?

我認為&#xff0c;閱讀和理解堆棧跟蹤是每個程序員都必須具備的一項基本技能&#xff0c;以便有效地解決每種JVM語言的問題&#xff08;另請參閱&#xff1a; 過濾日志中無關的堆棧跟蹤行和首先記錄引起異常的根本原因 &#xff09;。 那么我們可以從一個小測驗開始嗎&#xf…

@select 怎么寫存儲過程_MySQL4:存儲過程和函數

什么是存儲過程簡單說&#xff0c;存儲過程就是一條或多條SQL語句的集合&#xff0c;可視為批文件&#xff0c;但是起作用不僅限于批處理。本文主要講解如何創建存儲過程和存儲函數以及變量的使用&#xff0c;如何調用、查看、修改、刪除存儲過程和存儲函數等。使用的數據庫和表…

跨域訪問-預請求及跨域常見問題

預請求 參考&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#預請求 簡而言之&#xff0c;在跨域并且嘗試添加一些特殊頭及自定義頭的情況下&#xff0c;由于瀏覽器的安全機制&#xff0c;會加多一次OPTIONS預請求&#xff08;詢問請求&am…

mysql查詢優化之一:mysql查詢優化常用方式

一、為什么查詢速度會慢&#xff1f; 一個查詢的生命周期大致可以按照順序來看&#xff1a;從客戶端&#xff0c;到服務器&#xff0c;然后在服務器上進行解析&#xff0c;生成執行計劃&#xff0c;執行&#xff0c;并返回結果給客戶端。其中在“執行”階段包含了大量為了檢索…

修復Sonar中常見的Java安全代碼沖突

本文旨在向您展示如何快速修復最常見的Java安全代碼沖突。 它假定您熟悉代碼規則和違規的概念以及Sonar如何對其進行報告。 但是&#xff0c;如果您以前從未聽說過這些術語&#xff0c;則可以閱讀Sonar Concepts或即將出版的有關Sonar的書 &#xff0c;以獲取更詳細的解釋。 為…

理解ThreadLocal

ThreadLocal:線程本地存儲&#xff0c;為每個線程都創建了變量的副本&#xff0c;線程在訪問變量時&#xff0c;可以直接訪問自己內部的副本變量。 理解幾個概念&#xff1a; 在java中ThreadLocal是一個類。 ThreadMap是一個類&#xff0c; Thread類是線程類。 ThreadLocal…

抖音右上角一個小黃點是什么_抖音官方入駐視頻號,釋放了一個什么樣的信號?...

專注視頻號觀察第 328 篇這幾天&#xff0c;視頻號生態新入駐了一個企業號&#xff0c;在圈里引起不少的轟動&#xff0c;因為這個號的名字叫做———抖音。這件事在圈里引發不少的轟動&#xff0c;很多人驚嘆&#xff1a;“連抖音都來開視頻號了&#xff0c;你還在等什么&…

資源包技巧和最佳實踐

今天是資源捆綁日。 通常&#xff0c;這是Java中最著名的國際化機制&#xff08;i18n&#xff09;。 使用它應該很容易。 但是&#xff0c;在弄臟手時會出現許多小問題。 如果您有相同的想法&#xff0c;則此文章適合您。 基本 java.util.ResourceBundle定義了用于訪問Java中翻…

springMvc-文件上傳

趕時間&#xff0c;又在寫垃圾博客&#xff0c;在心里給自己一耳巴 1.單文件上傳 2.多文件上傳 代碼&#xff1a; 頁面&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Insert title here</title></he…

c cuda 指定gpu_GPU并行編程:熟練使用CUDA C語言

【IT168 專稿】一個大任務通常可能被分解成許多可以一起處理的小任務&#xff0c;以便創建一個解決方案&#xff0c;這和粉刷房子的道理是一樣的&#xff0c;在粉刷之前&#xff0c;假設你需要買5公升油漆和5把刷子&#xff0c;你可以自己一個人干完采購和粉刷的活&#xff0c;…

js中使用0 “” null undefined {}需要注意

注意&#xff1a;在js中0為空&#xff08;false&#xff09; &#xff0c;代表空的還有“”&#xff0c;null &#xff0c;undefined&#xff1b; 如果做判斷if(&#xff01;上面的四種值)&#xff1b;返回均為false console.log(!null);// true console.log(!0);//true consol…

PhpStorm 10.0.3破解版下載

漢化破解版軟件下載&#xff1a; http://pan.baidu.com/s/1geNO24r 密碼: d5ci 這個漢化破解軟件解決了大綱視圖里空白的問題。 先安裝騰訊電腦管家&#xff0c;然后安裝這個軟件&#xff0c;安裝到最后提示有個文件有病毒已刪除&#xff0c;點確定后正常使用。轉載于:https://…