hibernate學習(四)

這一章講的是更深入的查詢操作炮沐,包括各種常用的查詢操作。分別用hql語言查詢和標準語言查詢實現(xiàn)。

  • 查詢所有
  • 條件查詢
  • 模糊查詢
  • 排序查詢
  • 分頁查詢
  • 聚合函數(shù)查詢

hql語言使用Query接口兴猩,使用hql語句饲梭,需要導入包org.hibernate.query.Query(5.2版本)

標準語言使用Criteria接口乘盖,內(nèi)部提供的方法,需要導入包import org.hibernate.Criteria

常用的Criteria接口方法如下:

  • public Criteria add(Criterion c) 用于添加限制(條件)憔涉。
  • public Criteria addOrder(Order o) 指定排序順序订框。
  • public Criteria setFirstResult(int firstResult) 指定要檢索的第一個記錄數(shù)。
  • public Criteria setMaxResult(int totalResult) 指定要檢索的記錄總數(shù)兜叨。
  • public List list() 返回包含對象的列表穿扳。
  • public Criteria setProjection(Projection projection) 指定投影衩侥。

Restrictions類提供可用作標準的方法。常用的Restrictions類方法如下:

  • public static SimpleExpression lt(String propertyName,Object value) 設置屬性小于約束
  • public static SimpleExpression le(String propertyName,Object value) 設置屬性小于或等于約束矛物。
  • public static SimpleExpression gt(String propertyName,Object value) 設置屬性大于約束茫死。
  • public static SimpleExpression ge(String propertyName,Object value) 設置屬性大于或等于約束。
  • public static SimpleExpression eq(String propertyName,Object value) 設置屬性與約束相等履羞。
  • public static Criterion between(String propertyName, Object low, Object high) 設置屬性在兩個約束之間峦萎。
  • public static SimpleExpression like(String propertyName, Object value) 將類似的約束設置為給定的屬性。

Order類代表排序順序忆首。常用的 Restrictions 類方法如下:

  • public static Order asc(String propertyName) 按指定屬性進行升序排列爱榔。
  • public static Order desc(String propertyName) 按指定屬性進行降序排列。

Projections類提供投影查詢與聚合函數(shù)查詢糙及。常用方法如下:

  • public static CountProjection count(String propertyName); 按照屬性計數(shù)
  • public static AggregateProjection max(String propertyName); 獲取某個屬性的最大值
  • public static AggregateProjection min(String propertyName); 獲取某個屬性的最小值
  • public static AggregateProjection avg(String propertyName); 獲取某個屬性的平均值
  • public static AggregateProjection sum(String propertyName); 獲取某個屬性的總和
  • public static PropertyProjection Projections.property(String propertyName); 按照屬性進行投影查詢

查詢所有

這個在第二章中就用過详幽,這里在寫一次

  • 使用hql語言查詢,hql語句from LinkMan LinkMan是實體類
    @Test
    public void queryAll() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
        
            Query<LinkMan> query = session.createQuery("from LinkMan");
            List<LinkMan> list = query.list();          
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 使用標準語言查詢丁鹉,調用方法實現(xiàn)
    @Test
    public void criteriaAll() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();

            Criteria criteria = session.createCriteria(LinkMan.class);
            List<LinkMan> linkMans = criteria.list();
            for (LinkMan linkMan : linkMans) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

條件查詢

  • 使用hql語言查詢
  1. hql語句from LinkMan where name = ?妒潭,調用方法org.hibernate.query.Query.setParameter(int arg0, Object arg1)為問號賦值,下標從0開始揣钦,這和jdbc略有不同雳灾。
  2. 也可以使用from LinkMan where name = :n語句,調用org.hibernate.query.Query.setParameter(String arg0, Object arg1)方法進行賦值冯凹。
    @Test
    public void queryTiaojian() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
//          Query<LinkMan> query = session.createQuery("from LinkMan where name = ?");
//          query.setParameter(0, "name");
            
            Query<LinkMan> query = session.createQuery("from LinkMan where name = :n");
            query.setParameter("n", "name");
            
            List<LinkMan> list = query.list();
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 使用標準語言查詢
    public void criteriaTiojian() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();

            Criteria criteria = session.createCriteria(LinkMan.class);\
            criteria.add(Restrictions.eq("name", "name"));

            List<LinkMan> linkMans = criteria.list();
            for (LinkMan linkMan : linkMans) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

模糊查詢

  • 使用hql語言查詢谎亩,hql語句from LinkMan where name like ?
    @Test
    public void queryMohu() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
            Query<LinkMan> query = session.createQuery("from LinkMan where name like ?");
            query.setParameter(0, "%哈%");
            List<LinkMan> list = query.list();
            
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 使用標準語言查詢
    @Test
    public void criteriaMohu() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
            Criteria criteria = session.createCriteria(LinkMan.class);
            criteria.add(Restrictions.like("name", "%哈%"));
            
            List<LinkMan> linkMans = criteria.list();
            for (LinkMan linkMan : linkMans) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

排序查詢

  • 使用hql語言查詢蔗候,hql語句from LinkMan order by lid desc
    @Test
    public void queryPaixu() {
        Session session = null;
        Transaction tx = null;
        
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
            Query<LinkMan> query = session.createQuery("from LinkMan order by lid desc");
            
            List<LinkMan> list = query.list();
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 標準語言查詢
    @Test
    public void criteriaPaixu() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();

            Criteria criteria = session.createCriteria(LinkMan.class);
            criteria.addOrder(Order.desc("lid"));
            
            List<LinkMan> linkMans = criteria.list();
            for (LinkMan linkMan : linkMans) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

分頁查詢

  • 使用hql語言查詢
    @Test
    public void queryPage() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
            // 倒序分頁
            Query<LinkMan> query = session.createQuery("from LinkMan order by lid desc");
            query.setFirstResult(0);  // 分頁開始行數(shù)
            query.setMaxResults(5);  // 規(guī)定每頁最大條數(shù)
            
            List<LinkMan> list = query.list();
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 使用標準查詢
    @Test
    public void criteriaPages() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();

            Criteria criteria = session.createCriteria(LinkMan.class);
            criteria.addOrder(Order.desc("lid"));
            criteria.setFirstResult(0);
            criteria.setMaxResults(5);
            
            List<LinkMan> linkMans = criteria.list();
            for (LinkMan linkMan : linkMans) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

投影查詢

  • 使用hql語言查詢有决,hql語句select name from LinkMan
    @Test
    public void queryTouyin() {
        Session session = null;
        Transaction tx = null;
        
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
            Query query = session.createQuery("select name from LinkMan");
            
            List<String> list = query.list();
            for (String string : list) {
                System.out.println(string);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 使用標準語言查詢
    @Test
    public void criteriaTouyin() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();

            Criteria criteria = session.createCriteria(LinkMan.class);
            criteria.setProjection(Projections.property("name"));
            
            List<String> strings = criteria.list();
            for (String string : strings) {
                System.out.println(string);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

聚合函數(shù)查詢

  • 使用hql語言查詢,hql語句和sql類似select count(lid) from LinkMan
    @Test
    public void queryFun() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            /**
             * 平均數(shù):avg()
             * 最小值:min()
             * 最大值:max()
             * 總數(shù):sum()
             * 計數(shù):count()
             */
            Query query = session.createQuery("select count(lid) from LinkMan");
            int count = Integer.parseInt(query.uniqueResult().toString());
            
            System.out.println(count);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
  • 使用標準語言查詢
    @Test
    public void criteriaFun() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            /**
             * 平均數(shù):avg()
             * 最小值:min()
             * 最大值:max()
             * 總數(shù):sum()
             * 計數(shù):count()
             */
            Criteria criteria = session.createCriteria(LinkMan.class);

            criteria.setProjection(Projections.count("lid"));  // Integer類型
            criteria.setProjection(Projections.rowCount()); // 統(tǒng)計查詢
            criteria.setProjection(Projections.max("lid"));
            criteria.setProjection(Projections.min("lid"));
            criteria.setProjection(Projections.sum("lid"));
            criteria.setProjection(Projections.avg("lid"));  //Float類型
            
            float avg = Float.parseFloat(criteria.uniqueResult().toString());
            System.out.println(avg);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

根據(jù)hibernate思想甜攀,一切數(shù)據(jù)庫操作都映射為對實體類的操作浑劳。所以在寫hql語句或者標準查詢中屬性時都要使用實體類中屬性名阱持。在標準查詢中這是必須的,hql語言中也可以使用數(shù)據(jù)庫中的字段魔熏,建議全部使用實體類屬性名衷咽。


在標準查詢中還提供了離線查詢的模式,代碼如下蒜绽。

    @SuppressWarnings("unchecked")
    @Test
    public void criteriaDetached() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HbmUtil.getSession();
            tx = session.beginTransaction();
            
            DetachedCriteria detachedCriteria = DetachedCriteria.forClass(LinkMan.class);
            Criteria criteria = detachedCriteria.getExecutableCriteria(session);
            
            List<LinkMan> list = criteria.list();
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }

就是構建criteria的方式不一樣镶骗,還有比直接創(chuàng)建有些好處。具體哪些躲雅,暫時不太明白鼎姊。我發(fā)現(xiàn)的一點就是,如果你使用的hibernate版本是5.2的使用createCriteria創(chuàng)建criteria已經(jīng)被廢棄了,而離線模式是沒有的相寇。既然被保留下來就有它的優(yōu)越之處慰于,以后慢慢發(fā)掘。

在官網(wǎng)查看了下其實Query接口也快要被廢棄了唤衫、东囚、、呃战授,是不是白學了。桨嫁。植兰。要不然還是老老實實用用dbutils吧~~

hibernate的一些基礎用法算是學完了,在深入的知識今后慢慢在研究吧璃吧。先記錄下我算是掌握的東西楣导。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畜挨,隨后出現(xiàn)的幾起案子筒繁,更是在濱河造成了極大的恐慌,老刑警劉巖巴元,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毡咏,死亡現(xiàn)場離奇詭異,居然都是意外死亡逮刨,警方通過查閱死者的電腦和手機呕缭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來修己,“玉大人恢总,你說我怎么就攤上這事〔欠撸” “怎么了片仿?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尤辱。 經(jīng)常有香客問我砂豌,道長,這世上最難降的妖魔是什么啥刻? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任奸鸯,我火速辦了婚禮,結果婚禮上可帽,老公的妹妹穿的比我還像新娘娄涩。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布蓄拣。 她就那樣靜靜地躺著扬虚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪球恤。 梳的紋絲不亂的頭發(fā)上辜昵,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音咽斧,去河邊找鬼堪置。 笑死,一個胖子當著我的面吹牛张惹,可吹牛的內(nèi)容都是我干的舀锨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宛逗,長吁一口氣:“原來是場噩夢啊……” “哼坎匿!你這毒婦竟也來了?” 一聲冷哼從身側響起雷激,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤替蔬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屎暇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體承桥,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年根悼,在試婚紗的時候發(fā)現(xiàn)自己被綠了快毛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡番挺,死狀恐怖唠帝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玄柏,我是刑警寧澤襟衰,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站粪摘,受9級特大地震影響瀑晒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜徘意,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一苔悦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椎咧,春花似錦玖详、人聲如沸把介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗踢。三九已至,卻和暖如春向臀,著一層夾襖步出監(jiān)牢的瞬間巢墅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工券膀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留君纫,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓芹彬,卻偏偏與公主長得像庵芭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雀监,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法眨唬,內(nèi)部類的語法会前,繼承相關的語法,異常的語法匾竿,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 本文包括:1瓦宜、Hibernate 的查詢方式2、HQL (Hibernate Query Language) 查詢...
    廖少少閱讀 2,663評論 0 15
  • 本文約定: 1. Nhibernate簡寫為NHB; 2. 本文例子的開發(fā)平臺為win2000pro+sp4, s...
    壹米玖坤閱讀 534評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理岭妖,服務發(fā)現(xiàn)临庇,斷路器,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • Commamd +N 新建一個pch文件pch.png 2.在工程的 Targets 里面的 Building S...
    小小白衣閱讀 682評論 0 1