溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java?Hibernate中的查詢方式有哪些

發(fā)布時(shí)間:2023-04-28 11:18:07 來(lái)源:億速云 閱讀:104 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“Java Hibernate中的查詢方式有哪些”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Java Hibernate中的查詢方式有哪些”文章吧。

    Hibernate 是一個(gè)開(kāi)源的 ORM(對(duì)象關(guān)系映射)框架,它可以將 Java 對(duì)象映射到數(shù)據(jù)庫(kù)表中,實(shí)現(xiàn)對(duì)象與關(guān)系數(shù)據(jù)庫(kù)的映射。Hibernate 提供了多種查詢方式,包括 OID 檢索、對(duì)象導(dǎo)航檢索、HQL 檢索、QBC 檢索和 SQL 檢索。除此之外,Hibernate 還提供了多種抓取策略,包括立即抓取、延遲抓取和批量抓取。

    查詢方式

    OID 檢索

    OID(Object IDentifier)是 Hibernate 中每個(gè)持久化對(duì)象的唯一標(biāo)識(shí)符。OID 檢索是通過(guò)調(diào)用 get() 或 load() 方法來(lái)獲得一個(gè)持久化對(duì)象的方式。這兩個(gè)方法的區(qū)別在于當(dāng)對(duì)象不存在時(shí),get() 方法返回 null,而 load() 方法會(huì)拋出 ObjectNotFoundException 異常。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    User user = (User) session.get(User.class, 1L);
    tx.commit();
    session.close();

    對(duì)象導(dǎo)航檢索

    對(duì)象導(dǎo)航檢索是通過(guò)調(diào)用一個(gè)持久化對(duì)象的 getter 方法獲得其他持久化對(duì)象的方式。例如,如果一個(gè) User 對(duì)象有一個(gè)關(guān)聯(lián)的 Order 對(duì)象,可以通過(guò)調(diào)用 user.getOrders() 方法來(lái)獲得該 User 的所有訂單。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    User user = (User) session.get(User.class, 1L);
    Set<Order> orders = user.getOrders();
    tx.commit();
    session.close();

    HQL 檢索

    HQL(Hibernate Query Language)是一種面向?qū)ο蟮牟樵冋Z(yǔ)言,類(lèi)似于 SQL,但是它查詢的是對(duì)象,而不是表。HQL 使用類(lèi)名和屬性名來(lái)表示表和字段,可以使用類(lèi)似于 SQL 的語(yǔ)法進(jìn)行查詢。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    List<User> users = session.createQuery("from User").list();
    tx.commit();
    session.close();

    QBC 檢索

    QBC(Query By Criteria)檢索是一種基于 Criteria API 的查詢方式,可以使用一組條件來(lái)查詢對(duì)象。Criteria API 提供了一種類(lèi)型安全的查詢方式,可以通過(guò)代碼來(lái)構(gòu)建查詢條件,從而避免了字符串拼接的風(fēng)險(xiǎn)。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    Criteria criteria = session.createCriteria(User.class);
    List<User> users = criteria.add(Restrictions.eq("name", "John")).list();
    tx.commit();
    session.close();

    SQL 檢索

    SQL 檢索是一種基于 SQL 語(yǔ)句的查詢方式,可以使用原生的 SQL 語(yǔ)句來(lái)查詢對(duì)象。使用 SQL 檢索的一個(gè)常見(jiàn)場(chǎng)景是查詢復(fù)雜的報(bào)表數(shù)據(jù)。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    SQLQuery query = session.createSQLQuery("select * from user");
    List<User> users = query.list();
    tx.commit();
    session.close();

    抓取策略

    立即抓取

    立即抓取是指在加載一個(gè)持久化對(duì)象時(shí),同時(shí)加載該對(duì)象關(guān)聯(lián)的其他持久化對(duì)象。這種方式可以避免在后續(xù)訪問(wèn)關(guān)聯(lián)對(duì)象時(shí)產(chǎn)生額外的 SQL 查詢,提高了系統(tǒng)的性能。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    List<User> users = session.createQuery("from User u left join fetch u.orders").list();
    tx.commit();
    session.close();

    延遲抓取

    延遲抓取是指當(dāng)訪問(wèn)一個(gè)持久化對(duì)象的關(guān)聯(lián)對(duì)象時(shí),才去加載該關(guān)聯(lián)對(duì)象。這種方式可以減少不必要的 SQL 查詢,提高系統(tǒng)的性能。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    User user = (User) session.get(User.class, 1L);
    Hibernate.initialize(user.getOrders());
    tx.commit();
    session.close();

    抓取策略

    Hibernate 提供了多種抓取策略,包括 join、select、subselect 和 batch 策略。這些策略可以在查詢時(shí)指定,從而控制 Hibernate 的抓取行為。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    Criteria criteria = session.createCriteria(User.class);
    criteria.setFetchMode("orders", FetchMode.JOIN);
    List<User> users = criteria.list();
    tx.commit();
    session.close();

    批量抓取

    批量抓取是指在加載一批持久化對(duì)象時(shí),同時(shí)加載這些對(duì)象關(guān)聯(lián)的其他持久化對(duì)象。這種方式可以減少不必要的 SQL 查詢,提高系統(tǒng)的性能。

    示例代碼:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    List<User> users = session.createQuery("from User u left join fetch u.orders").setFirstResult(0).setMaxResults(10).list();
    tx.commit();
    session.close();

    以上就是關(guān)于“Java Hibernate中的查詢方式有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI