Java Hibernate中的多種查詢方式及示例
Hibernate 是一個開源的 ORM(對象關(guān)系映射)框架,它可以將 Java 對象映射到數(shù)據(jù)庫表中,實(shí)現(xiàn)對象與關(guān)系數(shù)據(jù)庫的映射。Hibernate 提供了多種查詢方式,包括 OID 檢索、對象導(dǎo)航檢索、HQL 檢索、QBC 檢索和 SQL 檢索。除此之外,Hibernate 還提供了多種抓取策略,包括立即抓取、延遲抓取和批量抓取。本文將詳細(xì)介紹這些內(nèi)容。
查詢方式
OID 檢索
OID(Object IDentifier)是 Hibernate 中每個持久化對象的唯一標(biāo)識符。OID 檢索是通過調(diào)用 get() 或 load() 方法來獲得一個持久化對象的方式。這兩個方法的區(qū)別在于當(dāng)對象不存在時,get() 方法返回 null,而 load() 方法會拋出 ObjectNotFoundException 異常。
示例代碼:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); User user = (User) session.get(User.class, 1L); tx.commit(); session.close();
對象導(dǎo)航檢索
對象導(dǎo)航檢索是通過調(diào)用一個持久化對象的 getter 方法獲得其他持久化對象的方式。例如,如果一個 User 對象有一個關(guān)聯(lián)的 Order 對象,可以通過調(diào)用 user.getOrders() 方法來獲得該 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言,類似于 SQL,但是它查詢的是對象,而不是表。HQL 使用類名和屬性名來表示表和字段,可以使用類似于 SQL 的語法進(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 的查詢方式,可以使用一組條件來查詢對象。Criteria API 提供了一種類型安全的查詢方式,可以通過代碼來構(gòu)建查詢條件,從而避免了字符串拼接的風(fēng)險。
示例代碼:
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 語句的查詢方式,可以使用原生的 SQL 語句來查詢對象。使用 SQL 檢索的一個常見場景是查詢復(fù)雜的報表數(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();
抓取策略
立即抓取
立即抓取是指在加載一個持久化對象時,同時加載該對象關(guān)聯(lián)的其他持久化對象。這種方式可以避免在后續(xù)訪問關(guān)聯(lián)對象時產(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)訪問一個持久化對象的關(guān)聯(lián)對象時,才去加載該關(guān)聯(lián)對象。這種方式可以減少不必要的 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 策略。這些策略可以在查詢時指定,從而控制 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();
批量抓取
批量抓取是指在加載一批持久化對象時,同時加載這些對象關(guān)聯(liá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").setFirstResult(0).setMaxResults(10).list(); tx.commit(); session.close();
總結(jié)
本文對 Hibernate 的多種查詢方式、抓取策略和批量抓取進(jìn)行了詳細(xì)介紹。Hibernate 提供了多種查詢方式和抓取策略,可以根據(jù)實(shí)際需求選擇合適的方式和策略來提高系統(tǒng)的性能和穩(wěn)定性。同時也需要注意不同的查詢方式和抓取策略的使用場景,避免因?yàn)椴划?dāng)?shù)氖褂梅绞綄?dǎo)致系統(tǒng)性能下降的問題。
到此這篇關(guān)于Java Hibernate中的多種查詢方式及示例的文章就介紹到這了,更多相關(guān)Java Hibernate查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringDataJpa多表操作的實(shí)現(xiàn)
開發(fā)過程中會有很多多表的操作,他們之間有著各種關(guān)系,本文主要介紹了SpringDataJpa多表操作的實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11idea maven項(xiàng)目無法識別jar包里的class解決方案
這篇文章主要介紹了idea maven項(xiàng)目無法識別jar包里的class解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java中Stream流中map和forEach的區(qū)別詳解
本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04分享我的第一次java Selenium自動化測試框架開發(fā)過程
這篇文章主要介紹了分享我的第一次java Selenium自動化測試框架開發(fā)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03java導(dǎo)出數(shù)據(jù)庫的全部表到excel
這篇文章主要為大家詳細(xì)介紹了java導(dǎo)出數(shù)據(jù)庫的全部表到excel的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03