1. 程式人生 > >Hibernate學習:Hibernate資料查詢

Hibernate學習:Hibernate資料查詢

Hibernate Query Language(HQL)
Criteria Query
Native SQL
下面對其分別進行解釋
Hibernate Query Language:
HQL提供了是十分強大的功能,它是針對持久化物件,用取得物件,而不進行update,delete和insert等操作。而且HQL是面向物件的,具備繼承,多型和關聯等特性。
from子句
from子句是最簡單的HQL,例如from Student,也可以寫成 select s from Student s。它簡單的返回Student類的所有例項。
值得注意的是除了JAVA類和屬性的名稱外,HQL語句對大小寫不敏感。
select子句

有時並不需要取得物件的所有屬性,這時可以使用select子句進行屬性查詢,如select s.name from Student s。
例: public void HQLselectDEMO()
    {
        TRegister user = new TRegister();
        Session session = HibernateUtil.currentSession();
        Query query = session.createQuery("select u.userName from TRegister u");
        List list = query.list();
        for(int i = 0 ; i < list.size(); i++)
        {
            String name = (String)list.get(i);
            System.out.println(name);
        }

    }
如果要查詢兩個以上的屬性檜以陣列的方式返回,如下: public void HQLselectDEMO()
    {
        TRegister user = new TRegister();
        Session session = HibernateUtil.currentSession();
        Query query = session.createQuery("select u.userName ,u.sex from TRegister u");
        List list = query.list();
        for(int i = 0 ; i < list.size(); i++)
        {
            Object obj[] = (Object[])list.get(i);
            
            System.out.println(obj[0]+"    的性別是:"+obj[1]);
        }

    }

在使用屬性查詢時,由於使用物件陣列,操作和理解不太方便,如果將 一個object[]中所有成員封裝成一個物件就方便多了。下面的程式做了示例: public void HQLselectDEMO()
    {        
        Session session = HibernateUtil.currentSession();
        Query query = session.createQuery("select new TRegister(u.userName,u.sex) from TRegister u");
        List list = query.list();
        for(int i = 0 ; i < list.size(); i++)
        {
            //Object obj[] = (Object[])list.get(i);
            TRegister user = (TRegister)list.get(i);
            System.out.println(user.getUserName()+"    的性別是:"+user.getSex());
        }

        /**要正確執行以上程式,需要在TRegister類中加入一個相應的建構函式
         public TRegister(String userName,String sex) {
                this.userName = userName;
                this.sex = sex;
            }
          
*/

    }


統計函式查詢
可以在HQL中使用函式,經常使用的函式如下:
count():統計記錄條數。
min():求最小值。
max():求最大值。
sum():求和。
avg():求平均值。
例如,要取得Student例項的數量,可以編寫如下HQL語句:
select count(*) from Student
取得Student平均年齡的HQL語句:
select avg(s.age) from Student as s
可以使用distinct去除重複的資料:
select distinct s.age from Student as s

where子句
HQL也支援子查詢,它通過where子句實現這一機制。where子句可以讓使用者縮小要返回的例項的列表範圍。例如下面語句會返回所有名字為"Bill"的Student例項:
Query query = session.createQuery("from Student as s where s.name='Bill'");
where子句允許出現的表示式包括了SQL中可以使用的大多數情況。
數學操作:+,-,*,/
真假比較操作:=, >=, <=, <>, !=, like
邏輯操作:and ,or, not
字串連線:||

SQL標題函式 :如upper()和lower()
如果查詢返回多條記錄,可以用以下關鍵字來量化
all:表示所有的記錄。
any:表示所有記錄中的任意一條。
some:與any相同。
in:與any等價。
exists:表示子查詢至少要返回一條記錄。
例如,下面語句返回所有學生年齡都大於18的班級物件
from Group g where 18<all  (select s.age from g.students s)
下列語句返回在所有學生中有一個學生的年齡等於22的班級:
from Group g where 22 = any (select s.age from g.students s)
或者
from Group g where 22= some(select s.age from g.students s)
或者
from Group g where 22 in (select s.age from g.students s)

order by子句
查詢返回列表可以按照任何返回的類或者元件的屬性排序
from Student s order by s.name asc

連線查詢
與SQL一樣,HQL也支援連線查詢,如內連線,外連線和交叉連線:
inner join:內連線
left outer join:左外連線
rigth outer join:右外連線
full join:全連線,但不常用
下面我重點介紹下內連線查詢,左外連線和或外連線和內連線大同小異,而全連線幾乎沒有使用得到的地方。
inner join可以簡寫為join,例如在查詢得到的Group物件時,內連線取得對應的Student物件,實現的程式程式碼如下:

Student stu = null;
        Group group = null;
        Query query = session.createQuery("from Group g join g.students");
        List list = query.list();
        Object obj[] = null;
        for(int i = 0 ; i < list.size(); i++)
        {
            obj = (Object[])list.get(i);
            group = (Group)obj[0];//group是陣列是第一個物件
            stu = (Student)obj[1];//stu是陣列的第二個物件
            System.out.println(stu.getName()+"屬於"+group.getName());
        }

    
Criteria Query方式
 當查詢資料時,往往需要設定查詢條件。在SQL或HQL語句中,查詢條件常常放在where子句中。此處Hibernate還支援Criteria查詢,這種查詢方式把查詢條件封裝為一個Criteria物件。在實際應用中,可以使用Session的createCriteria()方法構建一個org.hibernate.Criteria例項,然後把具體的查詢條件通過Criteria的add方法加入到Criteria例項中。這樣程式設計師可以在不使用SQL甚至HQL的情況下進行資料查詢。如下:     public void criteriaDEMO()
    {
        Session session = HibernateUtil.currentSession();
        Criteria criteria = session.createCriteria(TRegister.class);//生成一個Criteria例項
        criteria.add(Restrictions.eq("userName","fengyan"));//等價於where name = 'fengyan'
        List list = criteria.list();
        TRegister user = (TRegister)list.get(0);
        System.out.println(user.getUserName());
    }

常用的查詢限制方法
 上面程式碼中 Restrictions.eq()方法表示equal,即等於的情況。Restrictions類提供了查詢限制機制。它提供了許多方法,以實現查詢限制
Restrictions.eq():equal,=
Restrictions.allEq(): 引數為Map物件,使用key/value進行多個等於的對比,相當於多個                                          Restrictions.eq()的效果
Restrictions.gt():greater-than,<
Restrictions.lt():less-than,<
Restrictions.le:less-equal,<=
Restrictions.between():對應SQL的between子句。
Restrictions.like():對應SQL的like子句。
Restrictions.in():對應SQL的in子句。
Restrictions.and():and 關係。
Restrictions.or():or 關係。
Restrictions.isNull():判斷屬性是否為空,為空返回true,否則返回false。
Restrictions.isNoyNull():與上面的相反。
Order.asc():根據傳入的欄位進行升序排序。
Order.desc():與上相反
MatchMode.EXACT:字串中精確匹配,相當於like 'value'
MatchMode.ANYWHERE:字串在中間位置,相當於like'%value%'
MatchMode.START:字串在最前面,相當於like'value%'
MatchMode.END:字串在最後,相當於like'%value'
下面是幾個查詢限制的例子:
查詢學生名字以t開關的所有Student物件
Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "t%"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
或者:
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "t",MatchMode.START));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
查詢學生姓名在Bill,Jack和Tom之間所有的Student物件
 String[] names = {"Bill","Jack","Tom"};
  Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.in("name", names));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
查詢學生年齡(age)等於22或為空(null)的所有學生物件
Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.eq("age", new Integer(22)));
  criteria.add(Restrictions.isNull("age"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
查詢學生姓名以字母F開頭的所有Student物件,並按姓名升序排序
Criteria criertia = session.createCriteria(Student.class);
  criteria.add(Restrictions.like("name", "F%"));
  criteria.addOrder(Order.asc("name"));
  List list = criteria.list();
  Student stu = (Student)list.get(0);
注意呼叫Order.asc的方法應該是Criteria.addOrder()方法。

連線限制
Criteria查詢中使用FetchMode來實現連線限制。在HQL語句中,可以通過fetch關鍵字來表示預先抓取(Eager fetching),如下:
from Group g 
left join fetch g.students s
where g.name like '%2005'
可以使用Criteria的API完成同樣的功能,如下:

Criteria criertia = session.createCriteria(Group.class);
        criteria.setFetchMode("students", FetchMode.EAGER);
        criteria.add(Restrictions.like("name", "2005",MatchMode.END));
        List list = criteria.list();

以上兩種方式編寫的程式碼都使用相同的SQL語句來完成它們的功能,如下:
select  g.*, s.* from Group g
left outer join Student s
on g.id = s.group_id
where g.name like '%2005'

Native SQL查詢
本地SQL查詢指的是直接使用本地資料庫的SQL語言進行查詢。這樣做對於將 原來的SQL/JDBC程式遷移到Hibernate應用很有用
建立一個基於SQL的Query
Native SQL查詢是通過SQLQuery介面來控制的,它通過呼叫Session.createSQLQuery()方法來獲得。如:

String sql = "select {s.*} from t_student s where s.age>22";
//{}用來引用資料表的別名,{s.*}表示使用s來做為t_student表的別名
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity("s",Student.class);
List list = sqlQuery.list();
for(int i = 0 ; i < list.size(); i++)
{
    Student stu = (Student)list.get(i);
}

//createSQLQuery(String sql)利用傳入的sql引數構造一個SQLQuery例項。使用該方法時,還需要傳入查詢的實體類,因此在配合使用SQLQuery的addEntity()方法一起使用。
命名SQL查詢
與HQL的命名查詢相似,也可以將 本地的SQK查詢語句定義在對映檔案中,然後像呼叫一個命名HQL查詢一樣專題報道呼叫命名SQL查詢。
如:   </class>
    
    <sql-query name="QueryStudents">
        <![CDATA[
                    select {s.*} from t_student s where s.age > 22
        
]]>
            <return alias="s" class="Student"/>
    </sql-query>
</hibernate-mapping> 配合以上配置我們可以如下編寫程式碼來查詢 Query query = session.getNamedQuery("QueryStudents");
List list = query.list();
for(int i = 0 ; i < list.size();i++)
{
    Student stu = (Student)list.get(i);

}
也可以在命名查詢是設定引數,如下:  <sql-query name="QueryStudents">
        <![CDATA[
                    select {s.*} from t_student s where s.age > :age
        
]]>
            <return alias="s" class="Student"/>
    </sql-query>
</hibernate-mapping> 程式程式碼: Query query = session.getNamedQuery("QueryStudents");
query.setInteger("age",22);
List list = query.list();
for(int i = 0 ; i < list.size();i++)
{
    Student stu = (Student)list.get(i);

}
自定義insert , update和delete語句
Hibernate 3.x的對映檔案中新新增<sql_insert>,<sql_update>,<sql-delete>3個標記。可以使用這3個標記自定義自己的insert ,update,delete語句,如: </class>
    <sql-insert>
        insert into t_student(name,age,id) values(?,?,?)
    </sql-insert>
    <sql-update>
        update t_student set name=?,age=? where id=?
    </sql-update>
    <sql-delete>
        delete from t_student where id = ?
    </sql-delete>
</hibernate-mapping> 對於以上自定義的SQL語句,要注意以下幾點
1:insert 和update語句中定義的欄位必須和對映檔案宣告的屬性相應,一個都不能少。
2:在insert 和update語句中,屬性出現的順序必須和對映檔案中的順序一樣。
3:在insert語句中,主鍵id總是放在最後。
在程式中實現以上自定義的insert語句如下: Student stu = new Student();
stu.setName("Bill");
stu.setAge(22);
session.save(stu); 如果不想在insert或update語句中包括所有屬性,則可以在屬性定義時 加上insert ="false"或update="false"如下: <property name = "name" type="string" insert = "false" update="false"/>
<sql-insert>
    insert into t_student(age,id) values(?,?)
</sql-inert>

相關推薦

Hibernate學習Hibernate資料查詢

Hibernate Query Language(HQL)Criteria QueryNative SQL下面對其分別進行解釋Hibernate Query Language:HQL提供了是十分強大的功能,它是針對持久化物件,用取得物件,而不進行update,delete和

Hibernate學習Hibernate的cache管理

Cache就是快取,它往往是提高系統性能的最重要手段,對資料起到一個蓄水池和緩衝的作用。Cache對於大量依賴資料讀取操作的系統而言尤其重要。在大併發量的情況下,如果每次程式都需要向資料庫直接做查詢操作,它們所帶來的效能開銷是顯而易見的,頻繁的網路輿,資料庫磁碟的讀寫操作都

Hibernate學習10——Hibernate 查詢方式

9.png property ice pub gets reat sed desc ring 本章主要是以查詢Student的例子: Student.java: package com.cy.model; public class Student { priv

Follow Me深入淺出學習HibernateHibernate關聯對映多對一

引入 Hibernate是面向物件思維來轉換成資料庫關係模型。當我們用面向物件思維考慮問題的時候我們就應該考慮如何生成對映關係。如何生成一個符合我們心意的資料表。下面我們進行一一解答。 關聯對映,就是將關聯關係對映到資料庫中,所謂的關聯關係在物件模型在記憶體中的一個或多個

Hibernate學習5—Hibernate操作對象2

之前 on() nbsp select語句 代理 teacher 內存 不存在 png 第二節:Session 常用方法講解                                         2)load和get()方法: 數據庫中不存在與OID 對應的記

Hibernate學習7—Hibernate 映射繼承

util list uid per ges setname rop uname int 需求:學生有很多照片,分為生活照和工作照; 第一節:每個具體類對應一個表                         Student.java: package com.cy.m

Hibernate學習8—Hibernate 映射關系

表結構 image pri getaddr log bsp www. pla 數據庫 第一節:Hibernate 一對一映射關系實現 假設一個用戶對應一個地址; 1)按照主鍵映射: User.java: package com.cy.model; publi

hibernate學習Hibernate補充

-s pos 映射 tro hibernate OS spa ron size 1 MiddleGenIDE可以生成映射類和映射文件。 2 hibernate學習五 Hibernate補充

hibernate學習Hibernate緩存

應用層 OS 再次 架構 功能 employ 組織 tcp join 緩存:    如果在集群環境下使用Hibernate時,(集群有節點A ,節點B) 當請求,發往A節點,A在數據庫中修改了一條記錄,然後節點B的緩存中如何實時的更新節點A修改的新數據 h

Mysql --學習大量資料快速匯入匯出

宣告:此文供學習使用,原文:https://blog.csdn.net/xiaobaismiley/article/details/41015783  【實驗背景】 專案中需要對資料庫中一張表進行重新設計,主要是之前未分割槽,考慮到資料量大了以後要設計成分割槽表,同時要對資料庫中其他表做好備份恢

mysql優化一資料查詢新增索引

一、索引是什麼? 索引是一種特殊的檔案(InnoDB資料表上的索引是表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。 更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度 二、索引目的 索引的目的在於提高查詢效率 三、索引原理 通過不斷的縮小想

hibernate學習hibernate的入門

hibernate 可能對於我並不是很陌生, 一個基於面向物件來操作SQL語句的框架,也就是一種ORM框架,在Java物件與關係型資料庫之間建立某種對映,來實現直接存取Java物件。 特點 將對資料庫的操作直接轉換為Java物件的操作,簡化開發。 通過修改一個持久層

深度學習醫療資料

一、乳腺:MIAS MiniMammographic Database MIAS MiniMammographic Database(來自researchgate的一個問答):322例,尺寸:1024*1024pixel,8位,影象資料是PGM格式,找到一個介紹

機器學習sklearn資料集與機器學習組成

二、模型的選擇演算法是核心,資料和計算是基礎。這句話很好的說明了機器學習中演算法的重要性。那麼我們開看下機器學習的幾種分類:監督學習分類 k-近鄰演算法、決策樹、貝葉斯、邏輯迴歸(LR)、支援

python3__深度學習TensorFlow__資料的生成與讀取(主要針對影象處理)

1.CSV檔案(提供影象地址和標籤) 1.1 建立 import os path = "pic" filenames = os.listdir(path=path) strText = "" with open(file="train_list.csv", mode="w") as

題目MySql資料查詢題目(學生和課程成績)

1)     建立student和score表 2)     為student表和score表增加記錄 3)     查詢student表的所有記錄 SELECT * from student 4)     查詢student表的第2條到4條記錄 SELECT * FROM

碼農小汪-Hibernate學習6-hibernate中Annocation修飾屬性

對於現在使用註解的方式更流行起來,感覺使用這個挺不錯的學習這些屬性還是有幫助,我們理解很多東西。 我們可以先建立資料庫之後再進行,利用MyEclipse進行反向操作,產生javaBean實體,可以是註解的,可以是xml的。自己喜歡,但是自己還是要看的懂 前面

Oracle_2oracle 資料 查詢,遷移之dblink的建立

一、測試條件、環境 1、測試條件: 1號伺服器(目標資料庫) SID:orcl 1 使用者名稱:user1 密碼:pwd1 IP地址:192.168.4.1 3號伺服器(源資料庫) SID:orcl3

量化交易學習交易資料自動抓取

     題記:一直對量化交易比較感興趣,想先自學一下,將來如果有機會,能到機構實戰就更棒了。去年用matlab做過一個股票下一交易日價格區間的預測演算法,至少在股災前那段時間準確率還行(別笑,預測區間當然不是在正負10%之間),不過受限於自己的本職工作強度太大(苦逼的

授人以漁stm32資料查詢技巧

摘要:本章以stm32f103作為案例向大家講解arm公司和st公司的關係以及我們在對stm32開發時需要如何正確的查詢手冊。 ARM公司和ST公司的關係 這裡要從一塊晶片的生產說起,比如我們要生成一款晶片,我們可以自己涉及核心,涉及好了之後就叫XXX架構晶片,但是一般情況下不會這麼做,因為設計核心十分複雜,